CREATE TYPE o_A AS OBJECT (A1 VARCHAR2 (4000));
CREATE OR REPLACE TYPE t_A IS TABLE OF o_A;
CREATE TABLE table_o_A
(
oA_id INTEGER GENERATED BY DEFAULT AS IDENTITY,
oA o_A,
PRIMARY KEY (oA_id)
);
我想在 table_oA 中添加 t_A 的行。
CREATE PROCEDURE aa (query_result t_A)
is
v_i INTEGER;
begin
SELECT MAX (oA_id)
INTO v_i
FROM table_o_A;
FORALL i IN INDICES OF query_result
INSERT INTO table_o_A(
oA_id,
oA)
VALUES ( v_i i, query_result (i));
end;
[錯誤] 編譯 (887: 26): PLS-00430: FORALL 迭代變數 I 在此背景關系中是不允許的
我認為它不起作用,因為 i 不是整數。我可以使用 for 回圈并使用真正的整數,但它會在 pl/sql 和 sql 背景關系之間進行切換。如何使用 ForAll 回圈來做到這一點?
代碼
Alex Poole 的解決方案
uj5u.com熱心網友回復:
我認為它不起作用,因為 i 不是整數。
不,這是對forall語法的限制;從檔案中,您的i索引是(添加了重點):
FORALL 陳述句本地的隱式宣告的整數變數的名稱。FORALL 陳述句之外的陳述句不能參考索引。FORALL 陳述句中的陳述句可以參考索引作為索引變數,但不能在運算式中使用它或更改它的值。FORALL 陳述句運行后,索引未定義。
您oA_id是一個序列支持的標識列 - 盡管只是默認值,但并非總是如此 - 因此您不必指定值。除非您已經混合了手動和自動分配的 ID 值,否則您獲得的最大值將與序列值兼容(當然,可能存在差距);但是手動設定 ID 值后,序列將不同步,并且您會從自動分配的值中得到沖突,除非它被重置為當前限制。
除非您有充分的理由混合手動和自動,否則您可以簡化您正在做的事情:
CREATE PROCEDURE a (query_result t_A)
is
begin
FORALL i IN INDICES OF query_result
INSERT INTO table_o_A(oA)
VALUES (query_result (i));
end;
/
...并且僅在插入陳述句中提供物件。
db<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/478841.html
標籤:甲骨文
