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)
是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)