我在Oracle中有一个简单的类型声明和一个简单的函数:
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()))
包体和规格都很好,但是,当我试图运行包时,我得到了:
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
任何想法为什么会发生这种情况?
提前致谢!
答案 0 :(得分:1)
从包体中删除类型定义并在
之外创建CREATE TYPE col_sub_type IS TABLE OF VARCHAR2(50);
答案 1 :(得分:0)
您可能已经将类型col_sub_type
定义了两次:一次在SQL上下文中,一次在PL / SQL上下文中(在包中)。类型可能看起来相同,但它们是不同的。您的PL / SQL函数使用PL / SQL中定义的类型,但您的SQL需要SQL中定义的类型。
删除该类型的PL / SQL定义,问题消失。
这与PL / SQL和SQL引擎以及引擎之间的上下文切换有关(谷歌更多)。