ORA-22163: 左侧和右侧集合的类型不同

ORA-22163: left hand and right hand side collections are not of same type

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

知道为什么会这样吗?

提前致谢!

您可能定义了类型 col_sub_type 两次:一次在 SQL 上下文中,一次在 PL/SQL 上下文中(在包中)。这些类型可能看起来相同,但它们是不同的。您的 PL/SQL 函数使用 PL/SQL 中定义的类型,但您的 SQL 需要 SQL.

中定义的类型

删除类型的 PL/SQL 定义,问题消失。

这与 PL/SQL 和 SQL 引擎以及引擎之间的上下文切换有关(google 更多)。

从包体中删除类型定义并在外部创建

CREATE TYPE col_sub_type IS TABLE OF VARCHAR2(50);