我正在使用 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 table 在 Cursor 或 for 循环中工作正常,但不能
当我将它用于 INSERT Oracle Database 12c 企业版时
版本 12.1.0.2.0 - 64 位生产 PL/SQL 版本 12.1.0.2.0 -
适用于 Linux 的生产 CORE 12.1.0.2.0 生产 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;
/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)