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 是在执行存储过程时

Oracle 批量插入数据怎么做

Oracle 批量插入数据怎么做

Oracle 12 PL/SQL 在触发器中检索存储过程名称

PL/SQL ORACLE:删除时触发更新