[英]Insert into table from collection type oracle 12c - ORA-00902: invalid datatype
我正在使用 Oracle 12.1 我以為我可以查詢 12c 中的表類型。當我嘗試執行這個包時,我收到錯誤 ORA-00902: invalid datatype。 我什至嘗試使用cast multiset,但仍然是同樣的錯誤。
我知道我們可以在數據庫級別創建對象然后查詢,但我不想。
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 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 - 生產
在仔細重新審視您的查詢后,我發現您是對的。 Insert
不起作用。 它看起來也是正確的。 我們已經有了FORALL INSERT
來將數據從集合插入到表中。 因此,排除了將額外的INSERT as Select Statement
的必要性。 但是,您可以在查詢的Where
子句中使用集合來使用SELECT
語句。 要制作和插入,您只需按照以下步驟操作即可。
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;
/
如果你想在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.