Oracle儲存過程中的IN子句傳參字串的問題
阿新 • • 發佈:2021-01-11
技術標籤:問題oracle儲存過程儲存過程in問題in關鍵字
在實際使用中,經常會有帶in的子查詢,如where id in (1,2,3),或者where name in ('a','b','c')這樣的情況,但是到儲存過程中,如果使用變數當作查詢條件會有問題。
示例:
CREATE OR REPLACE PROCEDURE test (vi_types in VARCHAR2) AS vs_str VARCHAR2(100); BEGIN -- vi_types當作條件查詢 SELECT name into vs_str FROM log_table WHERE type IN (vi_types); dbms_output.put_line(vs_str); end;
呼叫:
call test('a,b,c');
期待結果打印出型別為,a或者b或者c的,但是沒有,查詢原因以為是沒加單引號造成,改成:
call test('''a'',''b'',''c''');
還是不行,原因是直接傳的字串當作一個整體去查詢了,也就是type為'a,b,c',才能查出來,我們要的不是這個效果,修改後的
CREATE OR REPLACE PROCEDURE test (vi_types in VARCHAR2) AS vs_str VARCHAR2(100); BEGIN -- vi_types當作條件查詢 SELECT name into vs_str FROM log_table WHERE type IN ( SELECT REGEXP_SUBSTR(vi_types, '[^,]+', 1, rownum) FROM dual CONNECT BY rownum <= LENGTH(vi_types) - LENGTH(regexp_replace(vi_types, ',', '')) + 1 ); dbms_output.put_line(vs_str); end;
呼叫:
call test('a,b,c');
說明:
SELECT REGEXP_SUBSTR('a,b,c', '[^,]+', 1, rownum)
FROM dual
CONNECT BY
rownum <= LENGTH('a,b,c') - LENGTH(regexp_replace('a,b,c', ',', '')) + 1
查出的結果是:
參考:https://blog.csdn.net/qq_44952766/article/details/89448046