我有一个以varchar2形式接受输入的现有过程。 该输入字段实际上是一组以逗号分隔的数字,例如' 1,2,3'或者' 2,3'等
现在在程序中,想要在IN子句中使用这些数字,如:
PROCEDURE SAVE_SETTING (p_category_list IN VARCHAR2)
IS
BEGIN
UPDATE my_table
SET status = 'ACTIVE'
WHERE category_id IN ( p_category_list );
END;
现在my_table的category_id列是Number数据类型。 所以我必须将p_category_list转换为一组数字才能有效地进行查询:
UPDATE my_table
SET status = 'ACTIVE'
WHERE category_id IN ( 1,2,3);
而不是
UPDATE my_table
SET status = 'ACTIVE'
WHERE category_id IN ( '1,2,3');
我不想使用Dynamic sql(Execute Immediate)
有助于实现这一目标吗?
答案 0 :(得分:0)
Dynamic SQL会在这里为您提供帮助:
PROCEDURE SAVE_SETTING (p_category_list IN VARCHAR2)
IS
BEGIN
EXECUTE IMMEDIATE 'UPDATE my_table
SET status = ''ACTIVE''
WHERE category_id IN ( ' || p_category_list || ' )';
END;
答案 1 :(得分:0)
您应该尝试以下方法: - (这有助于在存储过程中使用逗号分隔列表作为'in'子句。无需动态查询)
UPDATE my_table
SET status = 'ACTIVE'
WHERE category_id in
(select ltrim(rtrim(regexp_substr(p_category_list,'[^,]+', 1, level)))
from dual connect by ltrim(rtrim(regexp_substr(p_category_list, '[^,]+', 1, level)))
is not null)));
答案 2 :(得分:0)
Hi This is just an example how you can effectively use the update.
SET serveroutput ON;
DECLARE
p_list VARCHAR2(100);
my_list dbms_sql.number_table;
BEGIN
p_list:=('1,2,3,4,5,6,7,8,9'); --Your Input
SELECT regexp_substr(p_list,'[^,]+', 1, level) bulk collect -- used to collect each input as number
INTO my_list
FROM dual
CONNECT BY regexp_substr(p_list, '[^,]+', 1, level) IS NOT NULL;
forall i IN my_list.first..my_list.last
UPDATE emp SET mgr = my_list(i) WHERE deptno = 10;--update statement
dbms_output.put_line('working');
END;
答案 3 :(得分:0)
如果您不想使用动态SQL,可以使用like
:
UPDATE my_table
SET status = 'ACTIVE'
WHERE ',' || p_category_list || ',' like '%,' || category_id || ',%';
请注意每边的额外分隔符,以确保1
与10
不匹配。
答案 4 :(得分:0)
我会编写一个小函数,它通过p_category_list返回一个VARRAY,在函数单独的p_category_list中以你想要的方式返回,并在此过滤而不是在UPDATE中的p_category_list