2015-10-14 63 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