Я могу ЗАГРУЗИТЬ ЗАПРОСЫ в таблицы типа object, но не могу выполнить простую вставку. Должен ли я использовать НАСОСНЫЙ сбор даже для вставки в одну строку?

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;
3
Kurt 12 Апр 2018 в 02:10

1 ответ

Лучший ответ

Есть несколько способов добавить элементы в коллекцию, в том числе:

Заполните коллекцию в конструкторе:

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;
/

Или заполните таблицу построчно:

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;
/

Или используйте 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;
/

Используйте 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;
/

Или, если коллекция представляет собой вложенную таблицу, вы можете сделать это в SQL:

SQL Fiddle

Настройка схемы 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' ) )
/

Запрос 1 :

SELECT t.id, tt.id, tt.description
FROM   test t
       CROSS JOIN
       TABLE( t.tbl ) tt

Результаты :

| ID | ID | DESCRIPTION |
|----|----|-------------|
|  1 |  1 |         XXX |
|  1 |  2 |         YYY |
6
MT0 11 Апр 2018 в 23:57