PL/SQL:如何将所有记录从 table 类型插入到另一个 table 类型而无需 for 循环

PL/SQL: How to insert all records from table type to another table without for loop

我可能遇到了一些微不足道的问题,但我无法完全正确地确定逻辑。

我有以下类型:

create or replace TYPE test_rec FORCE
   AS OBJECT (ref_id NUMBER (20)
             ,ref_type VARCHAR2 (4));
create or replace TYPE test_ref_tbl FORCE
   AS TABLE OF test_rec;

实际table

CREATE TABLE my_tbl
( id number(10) NOT NULL,
  ref_id varchar2(20) NOT NULL,
  ref_type varchar2(4),
  CONSTRAINT my_pk PRIMARY KEY (id)
);

现在,在一个过程中我得到变量 test_ref_tbl 和数据,我必须将所有内容插入 my_tbl,id 也应该从序列中生成。

我设法用 for 循环很容易做到这一点

FOR i IN 1 .. test_ref_tbl.COUNT LOOP
  INSERT INTO my_tbl(id
                    ,ref_id
                    ,ref_type)
  VALUES (my_test_sequence.NEXTVAL
         ,test_ref_tbl(i).ref_id
         ,test_ref_tbl(i).ref_type
);
END LOOP;

一切正常,但我在 for 循环中插入数据时遇到了很多问题,我不是 plsql 开发人员,所以也许我的同事只是为了它而让我的工作变得更加困难。

回到主题,有没有不用 for 循环的方法?

谢谢

是的,有。这是一个例子:

首先创建测试用例:

SQL> CREATE OR REPLACE TYPE test_rec FORCE AS OBJECT
  2  (
  3     ref_id NUMBER (20),
  4     ref_type VARCHAR2 (4)
  5  );
  6  /

Type created.

SQL> CREATE OR REPLACE TYPE test_ref_tbl FORCE AS TABLE OF test_rec;
  2  /

Type created.

SQL> CREATE TABLE my_tbl
  2  (
  3     id         NUMBER (10) NOT NULL,
  4     ref_id     VARCHAR2 (20) NOT NULL,
  5     ref_type   VARCHAR2 (4),
  6     CONSTRAINT my_pk PRIMARY KEY (id)
  7  );

Table created.

SQL> CREATE SEQUENCE my_test_sequence;

Sequence created.

作为数据源,我使用 Scott 的 DEPT table。

SQL> DECLARE
  2     l_tab  test_ref_tbl;
  3  BEGIN
  4     SELECT test_rec (deptno, SUBSTR (dname, 1, 4))
  5       BULK COLLECT INTO l_tab
  6       FROM dept;
  7
  8     -- this is what you're looking for
  9     INSERT INTO my_tbl (id, ref_id, ref_type)
 10        SELECT my_test_sequence.NEXTVAL, t.*
 11          FROM TABLE (l_tab) t;
 12  END;
 13  /

PL/SQL procedure successfully completed.

SQL> SELECT * FROM my_tbl;

        ID REF_ID               REF_
---------- -------------------- ----
         1 10                   ACCO
         2 20                   RESE
         3 30                   SALE
         4 40                   OPER

SQL>