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