2017-06-21 44 views
3

我有一個過程,出於性能原因需要緩存一些數據以用於下游操作。如何從批量收集記錄表中選擇類型

TYPE定義工作

BULK COLLECT INTO作品

SELECT不起作用

PROCEDURE MYPROC((PARAMS))AS 

    TYPE REC_TYPE IS RECORD (
    COLUMN_1 (TABLEA.COLUMN_A)%TYPE, 
    COLUMN_2 (TABLEA.COLUMN_B)%TYPE 
); 

    TYPE TAB_TYPE IS TABLE OF REC_TYPE; 

    TABLE_1 TAB_TYPE; 

BEGIN 

    SELECT COLUMN_A, COLUMN_B 
    BULK COLLECT INTO TABLE_1 
    FROM TABLE_A; 

    SELECT * FROM TABLE_1; 

END MYPROC; 

產量:

錯誤(#,#):PL/SQL: ORA-00942:表或視圖不存在

我也試過它包裹在一個表函數,就像我做我的其它地方單柱類型,但沒有工作,要麼

SELECT * FROM TABLE(TABLE_1); 

錯誤(#,#):PL/SQL:ORA-22905:無法從非嵌套 表項

回答

1

你的問題實際上是訪問行的PLS-00642錯誤,而不是ORA-22905。本質上,你不能在SQL語句中使用本地集合類型。因此,解決方案是在模式級別定義您的類型。當以這種方式定義類型,我們不能使用%TYPE語法,而是必須明確定義列(Getting PLS-00201 error while creating a type in oracle),即

create or replace type rec_type as object (
    COLUMN_1 integer, 
    COLUMN_2 varchar2(128) 
); 

create or replace type tab_type as table of rec_type; 

然後,您需要將這些值顯式地轉換成相關類型,以執行如上所述批量收集:ORA-00947 Not enough values while declaring type globally。因此

你的過程將是這個樣子:

PROCEDURE MYPROC((PARAMS))AS 
    TABLE_1 TAB_TYPE; 
    lCount integer; 
BEGIN 

    SELECT REC_TYPE(COLUMN_A, COLUMN_B) 
    BULK COLLECT INTO TABLE_1 
    FROM TABLE_A; 

    SELECT COUNT(*) INTO lCount FROM TABLE(TABLE_1); 
END MYPROC; 
+0

感謝您給我們答案!我懷疑無法定義內聯對象,但是,它確實如此:[可能在PL/SQL中創建Oracle數據庫對象類型?](https://stackoverflow.com/questions/1069176/possible-你甚至不能在全局和內聯表中創建對象,否則你會得到'Error(#,#):PLS-00642: SQL語句中不允許使用本地集合類型「 –