[英]Insert into table from collection type oracle 12c - ORA-00902: invalid datatype
I am using Oracle 12.1 I thought I can query the table types in 12c.I get error ORA-00902: invalid datatype when I try to execute this package.我正在使用 Oracle 12.1 我以为我可以查询 12c 中的表类型。当我尝试执行这个包时,我收到错误 ORA-00902: invalid datatype。 I even tried using cast multiset,but still same error.我什至尝试使用cast multiset,但仍然是同样的错误。
I know we can create object at database level and then query, but I don't want to.我知道我们可以在数据库级别创建对象然后查询,但我不想。
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
The select * from table works fine in Cursor or for Loop, but does not when I use it for INSERT Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production PL/SQL Release 12.1.0.2.0 - Production CORE 12.1.0.2.0 Production TNS for Linux: Version 12.1.0.2.0 - Production NLSRTL Version 12.1.0.2.0 - Production select * from table 在 Cursor 或 for Loop 中工作正常,但当我将它用于 INSERT Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production PL/SQL Release 12.1.0.2.0 - Production CORE 12.1 时则不行。 0.2.0 用于 Linux 的生产 TNS:版本 12.1.0.2.0 - 生产 NLSRTL 版本 12.1.0.2.0 - 生产
After carefully revisiting your query, I found that you were correct.在仔细重新审视您的查询后,我发现您是对的。 Insert
doesnot work. Insert
不起作用。 And it looks correct as well.它看起来也是正确的。 We already have FORALL INSERT
to get data inserted from the collection to a table.我们已经有了FORALL INSERT
来将数据从集合插入到表中。 Hence the necessasity of having a additional INSERT as Select Statement
is ruledout.因此,排除了将额外的INSERT as Select Statement
的必要性。 However you can use the SELECT
statement using a collection in Where
clause of the query.但是,您可以在查询的Where
子句中使用集合来使用SELECT
语句。 To make and insert you can simply follow the below steps.要制作和插入,您只需按照以下步骤操作即可。
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;
/
Incase you want to use the Type
declared under PLSQL
scope in Select
statement, you can use as below:如果你想在Select
语句中使用在PLSQL
范围内声明的Type
,你可以使用如下:
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;
/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.