PL/SQL在Where子句中使用表变量

Ada*_*dam 1 oracle plsql user-defined-types

我有一个传递给过程的表变量.我想使用where子句中的值,如下所示,我该怎么做.下面的第一行是在包定义中声明的.以下过程在包体中.

type CatalogNos is table of VARCHAR2(100);
PROCEDURE GET_PART_CHARACTERISTICS (v_catalog_nos_  IN CatalogNos, 
                                    Parts_Char_Cursor out sys_refcursor) AS
BEGIN
    OPEN Parts_Char_Cursor FOR
    SELECT * FROM IFSAPP.SALES_PART_CHARACTERISTIC
    WHERE CATALOG_NO IN (select values from v_catalog_nos_);
END GET_PART_CHARACTERISTICS;
Run Code Online (Sandbox Code Playgroud)

APC*_*APC 5

CatalogNosSQL类型(即未在包规范中声明)?如果是这样:

PROCEDURE GET_PART_CHARACTERISTICS (v_catalog_nos_  IN CatalogNos, 
                                    Parts_Char_Cursor out sys_refcursor) 
AS
BEGIN
    OPEN Parts_Char_Cursor FOR
    SELECT * FROM IFSAPP.SALES_PART_CHARACTERISTIC
    WHERE CATALOG_NO IN (select * from table(v_catalog_nos_));
END GET_PART_CHARACTERISTICS;
Run Code Online (Sandbox Code Playgroud)

"这个SQL给出了一个错误:PLS-00642:SQL语句中不允许使用本地集合类型"

所以CatalogNos不是SQL类型,即它是在包规范或正文中声明的PL/SQL类型.错误消息非常明确:我们不能在SQL语句中使用PL/SQL类型.就是那样子.

最简单的解决方案是使用SQL类型.

SQL> create or replace type CatalogNos is table of VARCHAR2(100);    
  2  /

Type created.

SQL> 
Run Code Online (Sandbox Code Playgroud)

如果你真的不想创建自己的类型(为什么不呢?),你可以使用其中一个Oracle内置函数.像这样:

create or replace PROCEDURE GET_PART_CHARACTERISTICS
      (v_catalog_nos_  IN sys.dbms_debug_vc2coll,
       Parts_Char_Cursor out sys_refcursor)
AS
BEGIN
    OPEN Parts_Char_Cursor FOR
    SELECT * FROM IFSAPP.SALES_PART_CHARACTERISTIC
    WHERE CATALOG_NO IN (select * from table(v_catalog_nos_));
END GET_PART_CHARACTERISTICS;
/
Run Code Online (Sandbox Code Playgroud)