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

时间:2019-02-26 21:57:53

标签: sql oracle plsql

我正在使用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 :(得分:0)

  

表中的select *在Cursor或Loop中可以正常工作,但不能   当我将它用于INSERT Oracle Database 12c企业版时   版本12.1.0.2.0-64位生产PL / SQL版本12.1.0.2.0-   Linux的Production CORE 12.1.0.2.0 Production TNS:版本   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;
/