如何转换索引在一个整数在一个forall循环?


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&lt的在小提琴

最新更新