ORA-22163:左手和右手边的系列不是同一类型

时间:2015-10-14 21:10:19

标签: oracle plsql type-mismatch

我在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

任何想法为什么会发生这种情况?

提前致谢!

2 个答案:

答案 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引擎以及引擎之间的上下文切换有关(谷歌更多)。