我正在使用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
答案 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;
/