我有一个传递给过程的表变量。我想使用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;
答案 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;