ORACLE PL/SQL 使用单个插入语句插入多个对象
ORACLE PL/SQL Multiple objects insert using a single insert Statement
假设我有这样的东西
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 对象并立即将其插入循环之后?在单个插入语句中? Insted of single inserts ?
如果我没有正确理解你的问题,这里是如何做到的(虽然你的类型主体有错误,在我的例子中,它不需要,因为我根本不使用构造函数,所以它可以是从类型中删除):
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;
/
假设我有这样的东西
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 对象并立即将其插入循环之后?在单个插入语句中? Insted of single inserts ?
如果我没有正确理解你的问题,这里是如何做到的(虽然你的类型主体有错误,在我的例子中,它不需要,因为我根本不使用构造函数,所以它可以是从类型中删除):
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;
/