2015-10-14 61 views
-1

的不是我在Oracle中簡單的類型聲明和一個簡單的函數:ORA-22163:左手和右手邊的集合是同一類型

TYPE col_sub_type IS TABLE OF VARCHAR2(50); 

    FUNCTION get_col_tab RETURN col_sub_type AS 
    l_type col_sub_type; 
    BEGIN 
    SELECT DISTINCT TABLE_NAME 
    BULK COLLECT INTO l_type 
    FROM ALL_TAB_COLUMNS 
    WHERE TABLE_NAME IN ('TABLE_1','TABLE_2'); 
    RETURN l_type; 
END; 

的功能也因此它的包裝規格聲明可以用在包體中。

在我試圖在SQL語句中使用此功能的代碼之後,像這樣:

AND col.table_name NOT IN (SELECT * FROM TABLE(get_col_tab())) 

包體和規格均編譯perfecly罰款,不過,當我試圖運行包我得到:

ORA-22163: left hand and right hand side collections are not of same type 
ORA-06512: at "PACKAGE_NAME", line 25 
ORA-06512: at "PACKAGE_NAME", line 236 

第25行是:

RETURN l_type; 

236線是SELECT語句開頭:

SELECT col.table_name 

任何想法爲何這會發生?

在此先感謝!

+1

您可以發佈,編譯和沒有足夠的在這裏工作了是什麼問題表明了誤差最小的例子。 – MT0

+0

25行和236行並不總是表示錯誤在這些行中。也許錯誤經歷了這些線,所以如果你可以分享,如果不是整個包,只是包含25行和236行的完整塊。謝謝 – brenners1302

回答

1

刪除從包裝主體類型定義,外創建

CREATE TYPE col_sub_type IS TABLE OF VARCHAR2(50); 
+0

這解決了這個問題!但是,我剛剛得到了一個消息,我說Cannog創建了全局類型數據庫...所以問題回來了... – dziki

0

您可能定義了兩次類型col_sub_type:一次在SQL上下文中,一次在PL/SQL上下文中(在包中)。類型可能看起來相同,但它們是不同的。你的PL/SQL函數使用PL/SQL中定義的類型,但你的SQL需要SQL中定義的類型。

刪除該類型的PL/SQL定義,問題消失。

這與PL/SQL和SQL引擎以及引擎之間的上下文切換(google for more)有關。

+0

我不完全理解你的答案...和col_sub_type只定義一次在包體中...(但是在包規範中沒有描述它,或者我可以怎樣在SQL上下文中聲明一個類型?) – dziki