在对象的 Oracle 类型表中插入行

Kur*_*urt 4 oracle collections types oracle11g

我能够将 BULK COLLECT 查询查询到类型为 object 的表中,但似乎无法进行简单的插入。即使在单行插入中,我也必须使用 BULK 收集吗?

DROP TYPE T_TABLE;
/

CREATE OR REPLACE TYPE T_ROW AS OBJECT   
  (
    ID NUMBER(10),
    DESCRIPTION VARCHAR2(50)
  );
/ 

CREATE OR REPLACE TYPE T_TABLE AS TABLE OF T_ROW;
/

DECLARE

V_TABLE T_TABLE;
V_ROW T_ROW;

BEGIN
  INSERT INTO TABLE(V_TABLE) VALUES (1,'XXX');
  --INSERT INTO T_TABLE(V_TABLE) VALUES (T_ROW(1,'XXX'));
  --INSERT INTO TABLE(V_TABLE) VALUES (V_ROW(1,'XXX'));
END;
Run Code Online (Sandbox Code Playgroud)

MT0*_*MT0 8

有多种方法可以将项目添加到集合中,包括:

在构造函数中填充集合:

DECLARE
  V_TABLE T_TABLE := T_TABLE(
    T_ROW( 1, 'XXX' ),
    T_ROW( 2, 'YYY' ),
    T_ROW( 3, 'ZZZ' )
  );
BEGIN
  -- Do stuff with the collection here...
  NULL;
END;
/
Run Code Online (Sandbox Code Playgroud)

或者,逐行填充表格:

DECLARE
  V_TABLE T_TABLE;
BEGIN
  -- Constructor
  V_TABLE := T_TABLE();
  -- Extend by the default, 1 element
  V_TABLE.EXTEND;
  -- Populate that element
  V_TABLE(1) := T_ROW( 1, 'XXX' );

  -- Extend by 2 elements
  V_TABLE.EXTEND(2);
  V_TABLE(2) := T_ROW( 2, 'YYY' );
  V_TABLE(V_TABLE.COUNT) := T_ROW( 3, 'ZZZ' );

  -- Do stuff with the collection here...
END;
/
Run Code Online (Sandbox Code Playgroud)

或者,使用 SQL 和BULK COLLECT INTO

DECLARE
  V_TABLE T_TABLE;
BEGIN
  SELECT rw
  BULK COLLECT INTO V_TABLE
  FROM   (
    SELECT T_ROW( 1, 'XXX' ) AS rw FROM DUAL UNION ALL
    SELECT T_ROW( 2, 'YYY' ) FROM DUAL UNION ALL
    SELECT T_ROW( 3, 'ZZZ' ) FROM DUAL
  );
END;
/
Run Code Online (Sandbox Code Playgroud)

用于MULTISET UNION ALL连接集合:

DECLARE
  V_TABLE1 T_TABLE := T_TABLE( T_ROW( 1, 'XXX' ), T_ROW( 2, 'YYY' ) );
  V_TABLE2 T_TABLE := T_TABLE( T_ROW( 3, 'ZZZ' ) );
  V_TABLE3 T_TABLE;
BEGIN
  V_TABLE3 := V_TABLE1 MULTISET UNION ALL V_TABLE2;
END;
/
Run Code Online (Sandbox Code Playgroud)

或者,如果集合是嵌套表,那么您可以在 SQL 中执行此操作:

SQL小提琴

Oracle 11g R2 架构设置

CREATE TABLE test(
  id NUMBER,
  tbl T_TABLE
) NESTED TABLE tbl STORE AS test_tab
/

INSERT INTO test VALUES ( 1, T_TABLE() )
/
INSERT INTO TABLE( SELECT tbl FROM test WHERE id = 1 ) VALUES ( T_ROW( 1, 'XXX' ) )
/
INSERT INTO TABLE( SELECT tbl FROM test WHERE id = 1 ) VALUES ( T_ROW( 2, 'YYY' ) )
/
Run Code Online (Sandbox Code Playgroud)

查询 1

SELECT t.id, tt.id, tt.description
FROM   test t
       CROSS JOIN
       TABLE( t.tbl ) tt
Run Code Online (Sandbox Code Playgroud)

结果

| ID | ID | DESCRIPTION |
|----|----|-------------|
|  1 |  1 |         XXX |
|  1 |  2 |         YYY |
Run Code Online (Sandbox Code Playgroud)