0

pInCon 我传递为 ('1','2')

create or replace
PROCEDURE proc1
(
 pInCon in Varchar2,     
 P_RECORDSET OUT SYS_REFCURSOR  
) AS 
BEGIN
        open    P_RECORDSET for

    SELECT col1,col2
    FROM table1
    WHERE col1 IN pInCon;        
END  proc1; 

但是当我进行选择时,我看到了价值观。请帮忙

4

1 回答 1

1

假设您的意图是传递多个值而不是包含单引号、逗号等的单个字符串。最好的选择是传递一个实际的集合。就像是

CREATE TYPE num_table
   AS TABLE OF NUMBER;

CREATE OR REPLACE PROCEDURE proc1( p_in IN num_table,
                                   p_recordset OUT sys_refcursor )
AS
BEGIN
  OPEN p_recordset 
   FOR SELECT col1, col2
         FROM table1
        WHERE col1 IN (SELECT column_value FROM TABLE( p_in ));
END;

如果您确实需要传入逗号分隔值的字符串而不是集合,则可以将传入的字符串解析到存储过程中的集合中。Tom Kyte 有一篇关于处理变量 IN 列表的规范帖子,其中介绍了该方法。

也可以使用动态 SQL。不过,这有很多缺点。它更慢,它可能会通过用不可共享的语句淹没共享池而使在该数据库中运行的其他东西变慢,它引入了 SQL 注入攻击的可能性等。

于 2013-08-24T00:14:16.410 回答