1. 程式人生 > 其它 >Oracle儲存過程中的IN子句傳參字串的問題

Oracle儲存過程中的IN子句傳參字串的問題

技術標籤:問題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