ORACLE PL/SQL 使用单个 insert 语句插入多个对象
Posted
技术标签:
【中文标题】ORACLE PL/SQL 使用单个 insert 语句插入多个对象【英文标题】:ORACLE PL/SQL Multiple objects insert using a single insert Statement 【发布时间】:2020-11-05 07:12:33 【问题描述】:假设我有这样的东西
CREATE OR REPLACE TYPE t_A AS OBJECT (
var_n number,
var_v varchar2(12),
CONSTRUCTOR FUNCTION t_A(SELF IN OUT NOCOPY t_A) RETURN SELF AS RESULT
);
CREATE OR REPLACE TYPE BODY t_A AS
CONSTRUCTOR FUNCTION t_A(SELF IN OUT NOCOPY t_A) RETURN SELF AS RESULT IS
BEGIN
SELF.var_n := NULL;
SELF.var := NULL;
RETURN;
END;
END;
FOR RECORD IN cursor_x
LOOP
--> Some logic
--result is t_A object
insert_t_A(var_t_A);
END LOOP;
commit;
是否可以以某种方式存储所有创建的 t_A 对象并立即将其插入循环后?在单个插入语句中?插入单个插入?
【问题讨论】:
【参考方案1】:如果我正确理解了你的问题,这里是如何去做(虽然你的类型体有一个错误,在我的例子中,它是不需要的,因为我根本不使用构造函数,所以它可以从类型):
CREATE OR REPLACE TYPE t_A AS OBJECT (
var_n number,
var_v varchar2(12),
CONSTRUCTOR FUNCTION t_A(SELF IN OUT NOCOPY t_A) RETURN SELF AS RESULT
);
/
CREATE OR REPLACE TYPE BODY t_A AS
CONSTRUCTOR FUNCTION t_A(SELF IN OUT NOCOPY t_A) RETURN SELF AS RESULT IS
BEGIN
SELF.var_n := NULL;
SELF.var_v := NULL;
RETURN;
END;
END;
/
create table t_a_table (ocol t_a);
declare
type t_aob is table of t_a index by binary_integer;
tob t_aob;
i pls_integer:=1;
begin
for p in (select rownum rn from dual connect by level<11) loop
tob(i):=t_a(p.rn, p.rn||' str');
i:=i+1;
end loop;
forall i in 1..tob.count
insert into t_a_table values (tob(i));
end;
/
【讨论】:
是的,您理解正确。类型 t_aob 的含义是什么? t_a 索引的表是 binary_integer ?它有什么作用? “var .... is table of ... index by ...”的声明将集合类型创建为Associative Array。在此特别创建对象类型 t_A 的集合。以上是关于ORACLE PL/SQL 使用单个 insert 语句插入多个对象的主要内容,如果未能解决你的问题,请参考以下文章
将表中的单个值分配给 ORACLE PL/SQL 中声明的变量时出错
Oracle 11g 代码上的 PL/SQL 是在执行存储过程时