如何将单引号的varchar传递给Oracle中的Stored Proc

时间:2017-06-28 09:27:24

标签: oracle stored-procedures plsql

我有这样的存储过程:

call packagename.StoredProc(''''',''B''')

'A','B'部分则用作IN子句中过程代码中的参数。

当我使用in子句作为paramvalue IN ('A', 'B')运行该代码时,它会按预期返回行。

但是当执行对存储过程的调用时,没有任何行让我觉得这些引号必定是错误的但我显然无法正确行事。任何人都可以看到为什么这不起作用?感谢

来自proc的代码:

SELECT COUNT(*) 
            INTO v_PendingCheckCount
            FROM FUND_CHANGE_REQUEST
            WHERE STATUS IN ('PENDING_CHK', 'PEND_2ND_CHK')
            AND PROVIDER IN (pProviderList);

Proc电话:

CALL PackageName.ProcedureName('''A'',''B''')

pProviderList是传递给过程的参数。

2 个答案:

答案 0 :(得分:3)

传递集合而不是字符串并使用MEMBER OF而不是IN

CREATE OR REPLACE TYPE characterlist IS TABLE OF CHAR(1);
/

CREATE PACKAGE your_package AS
  PROCEDURE countPending(
    pProviderList IN  characterlist
    pCount        OUT INTEGER
  )
  AS
  BEGIN
    SELECT COUNT(*) 
    INTO pCount
    FROM FUND_CHANGE_REQUEST
    WHERE STATUS IN ('PENDING_CHK', 'PEND_2ND_CHK')
    AND PROVIDER  MEMBER OF pProviderList;
  END;
END;
/

然后你可以把它称为:

DECLARE
  vCount INTEGER;
BEGIN
  your_package.countPending(
    characterlist( 'A', 'B' ),
    vCount
  );
  DBMS_OUTPUT.PUT_LINE( vCount );
END;
/
  

任何人都可以看到为什么这不起作用?

您传递的是单个字符串而不是值列表 - 因此IN条件正在测试PROVIDER列是否与您的整个输入字符串完全匹配,而不是如您所假设的那样引用分隔列表的每个元素。

 WHERE 'A' IN ( q'['A', 'B']' )

永远不会匹配,因为'A'不等于q'['A', 'B']'(或'''A'', ''B''')且计数总是为零。

 WHERE 'A' IN ( 'A', 'B' )

匹配,但IN条件的表达式列表中有两个术语。

答案 1 :(得分:2)

不,你不能(嗯,你可以,但它将被视为一个字符串文字,而不是值列表)在查询的IN子句中使用纯逗号分隔值字符串。在这种情况下你可以(应该)做什么(作为其中一个选项)是在集合中转换逗号分隔的字符串并相应地使用它。这是一个例子:

注意:我在这里使用了内置的apex_application_global vc_arr2集合。       您可能决定创建自己的。由你决定。       如果您选择使用execute包,则可能需要获得apex_util个特权。

只是演示

set serveroutput on;
declare
   -- your source string
   l_str varchar2(100) := 'X, B, C';
   -- collection  the source string will be turned into  
   l_str_tab apex_application_global.vc_arr2;
   l_result number;
 begin
   -- convert the comma separated string of values
   -- into a collection 

   l_str_tab := apex_util.string_to_table(l_str, ',');

   -- Querying the collection using TABLE operator
   -- and passing result into the IN clause of the main query 

   select count(*)
     into l_result
     from dual
    where dummy in (select column_value
                      from table(l_str_tab));

    dbms_output.put_line(to_char(l_result));                  
 end;

结果:

1
PL/SQL procedure successfully completed.