gpt4 book ai didi

sql - 将多个变量传递到 PL/SQL 存储过程中的 WHERE 条件

转载 作者:行者123 更新时间:2023-12-02 07:06:25 30 4
gpt4 key购买 nike

在传递参数时执行此代码块时出现问题。参数 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com