Вставить в таблицу из коллекции тип oracle 12c - ORA-00902: неверный тип данных - PullRequest
0 голосов
/ 27 февраля 2019

Я использую Oracle 12.1. Я думал, что могу запросить типы таблиц в 12c. Я получаю ошибку ORA-00902: неверный тип данных при попытке выполнить этот пакет.Я даже пытался использовать приведение мультимножества, но все еще та же ошибка.

Я знаю, что мы можем создать объект на уровне базы данных и затем выполнить запрос, но я не хочу.

CREATE OR REPLACE PACKAGE test123 AS
 TYPE typ1 IS RECORD(col1 VARCHAR2(100),col2 VARCHAR2(100));
 TYPE tab_typ IS TABLE OF typ1 INDEX BY BINARY_INTEGER;
v_tab tab_typ;

PROCEDURE p1;
END;
/
CREATE OR REPLACE PACKAGE BODY test123 AS

PROCEDURE p1 IS
 BEGIN
  SELECT c1,c2 BULK COLLECT INTO v_tab FROM tabx;            
   INSERT INTO taby
     SELECT * FROM TABLE(v_tab);
  END;
END;
/

EXEC test123.p1;
--ORA-00902: invalid datatype

1 Ответ

0 голосов
/ 01 марта 2019

Выбор * из таблицы отлично работает в курсоре или в цикле, но не при использовании его для INSERT Oracle Database 12c Enterprise Edition, выпуск 12.1.0.2.0 - 64-битная версия PL / SQL версии 12.1.0.2.0 - Производство CORE 12.1.0.2.0 Производство TNS для Linux: Версия 12.1.0.2.0 - Производство NLSRTL Версия 12.1.0.2.0 - Производство

После тщательного повторного рассмотрения вашего запроса я обнаружил, что выбыли правильны.Insert не работает.И это выглядит правильно.У нас уже есть FORALL INSERT для вставки данных из коллекции в таблицу.Следовательно, необходимость наличия дополнительного INSERT as Select Statement исключается.Однако вы можете использовать оператор SELECT, используя коллекцию в предложении Where запроса.Чтобы сделать и вставить, вы можете просто выполнить следующие шаги.

CREATE OR REPLACE PACKAGE BODY test123 
AS
PROCEDURE p1 IS
 BEGIN
  SELECT c1,c2 BULK COLLECT INTO v_tab FROM tabx;  

  ForAll rec in 1..v_tab.count
   INSERT INTO taby
    values v_tab(rec);
     --SELECT * FROM TABLE(v_tab);
  END;
END;
/

Если вы хотите использовать Type, объявленный в области действия PLSQL в выражении Select, вы можете использовать его следующим образом:

DECLARE
 TYPE typ1 IS RECORD(col1 VARCHAR2(100),col2 VARCHAR2(100));
 TYPE tab_typ IS TABLE OF typ1 INDEX BY BINARY_INTEGER;
 v_tab tab_typ;
BEGIN

 SELECT col1,col2 BULK COLLECT INTO v_tab FROM tabx;  

  DELETE FROM taby
    WHERE (col1,col2) in (Select * from table(v_tab)); 

END;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...