我正在使用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
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子句中的语句。要制作和插入,只需按照以下步骤操作即可。
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声明,可以使用以下方法:
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; /