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

时间:2011-12-28 20:00:40

标签: 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;

3 个答案:

答案 0 :(得分:5)

CatalogNos是否为SQL类型(即未在包规范中声明)?如果是这样的话:

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;

  

“此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> 

如果你真的不想创建自己的类型(为什么不呢?),你可以使用其中一个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;
/

答案 1 :(得分:2)

create type CatalogNos is table of VARCHAR2(100);

CREATE OR REPLACE PACKAGE your_package as
   PROCEDURE GET_PART_CHARACTERISTICS (v_catalog_nos_  IN CatalogNos, 
                                       Parts_Char_Cursor out sys_refcursor);
END your_package;

CREATE OR REPLACE PACKAGE BODY your_package as
   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 column_value from table(v_catalog_nos_));
   END GET_PART_CHARACTERISTICS;
END your_package;

类型定义必须是数据库对象,而不是包的一部分,才能在SQL中使用。一旦这是真的,您可以使用table函数在from子句中引用该类型的变量。


基于注释,似乎我需要重新迭代:为了在SQL中引用用户定义的数据类型,必须将类型定义为包外的单独对象。


对于包含单个未命名字段的用户定义表,您可以使用select *select column_value

答案 2 :(得分:0)

使用||用于将查询与变量

连接起来

类似的东西:

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;