簡體   English   中英

從集合類型 oracle 12c 插入表 - ORA-00902: 無效數據類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM