一尘不染

从集合类型Oracle 12c插入表中-ORA-00902:无效的数据类型

sql

我正在使用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

阅读 388

收藏
2021-05-16

共1个答案

一尘不染

select * from表在Cursor或for Loop中工作正常,但是当我将它用于INSERT Oracle Database
12c企业版12.1.0.2.0版-64位生产PL / SQL版本12.1.0.2.0-生产CORE
12.1时,它不能正常工作。适用于Linux的0.2.0生产TNS:版本12.1.0.2.0-生产NLSRTL版本12.1.0.2.0-生产

仔细查看您的查询后,我发现您是正确的。Insert不起作用。而且看起来也很正确。我们已经必须FORALL INSERT将数据从集合插入到表中。因此,排除了额外INSERT as Select Statement的必要性。但是,您可以使用查询SELECT的collection
inWhere子句中的语句。要制作和插入,只需按照以下步骤操作即可。

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;
/
2021-05-16