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的解决方案
我认为它不能工作,因为它不是整数。
不,这是对forall
语法的限制;从文档中,您的i
索引是(强调添加):
隐式声明的整数变量的名称,该变量是FORALL语句的局部变量。FORALL语句之外的语句不能引用索引。FORALL语句中的语句可以引用index作为索引变量,但不能在表达式中使用它。或者改变它的值。FORALL语句运行后,index未定义。
你的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;
/
…而只有提供insert语句中的对象。
,db<的在小提琴