在传递参数时执行此代码块存在问题。参数rf是要输入到WHERE子句中的变量的列表。要输入的变量数不是静态的。
create or replace
procedure test_pl(rf in varchar2)
IS
counter number;
BEGIN
select count(*) into counter from test_pl_imp where column_name in (rf);
dbms_output.put_line(counter);
END;
执行代码如下:
declare
inparam varchar2(20) := 'xyz,ran,dom';
begin
goku.test_pl(inparam);
end;
/
我希望WHERE条件像这样执行:
where column_name in ('xyz','ran','dom');
但是它考虑将
xyz,ran,dom
作为字符串本身来执行。有什么办法可以实现?
最佳答案
您可以将字符串爆炸掉,或者最简单的方法是使用INSTR。
rf := ',' || rf || ',';
SELECT
COUNT(*)
INTO
counter
FROM
test_pl_imp
WHERE
INSTR(rf, ',' || column_name || ',') > 0;
如果您可以选择稍微重新设计,我认为采用字符串数组并将其强制转换为TABLE以便加入test_pl_imp会是一种更干净的设计。
可以按照以下步骤进行:
DECLARE
l_array goku.t_type := goku.t_type();
BEGIN
l_array.extend(3);
l_array(1) := 'xzy';
l_array(2) := 'abc';
l_array(2) := '123';
goku.test_pl(l_array);
END;
然后,您的软件包规格将包括以下内容,因为您希望上述调用的类型和过程公开:
CREATE OR REPLACE PACKAGE goku
TYPE r_type IS RECORD (
search_term VARCHAR2 (30)
);
TYPE t_type IS TABLE OF r_type;
PROCEDURE test_pl(l_array IN t_type);
END goku;
您的包主体将如下所示:
CREATE OR REPLACE PACKAGE BODY goku
PROCEDURE test_pl(l_array IN t_type) IS
v_counter NUMBER;
BEGIN
SELECT
COUNT(tpi.*)
INTO
v_counter
FROM
test_pl_imp tpi
, TABLE( CAST(l_array as r_type)) la
WHERE
tpi.column_name = la.search_term;
DBMS_OUTPUT.PUT_LINE('Count :' || v_counter);
END;
END goku;
关于sql - 在PL/SQL存储过程中将多个变量传递到WHERE条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11310975/