2014-07-23 50 views
0

我有一個現有的過程,它以varchar2的形式接受輸入。 這個輸入字段實際上是一組由逗號分隔的數字。 '1,2,3' 或 '2,3' 等使用數字的字符串(Varchar2)作爲數字

現在過程內,希望在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'); 

我DONOT要使用動態SQL(執行即時)

任何幫助實現這一目標?

+0

您p_category_list可以提供輸入值本身作爲「 1' , '2', '3'? –

+0

我無法以任何方式更改輸入。 – Arnab

回答

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; 
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; 
+0

我知道它很容易使用動態SQL,但我不想使用動態SQL。 – Arnab

0

你應該嘗試的東西,如: -
(這有助於在存儲過程中使用逗號分隔的列表作爲「在」條款無需動態查詢。)

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))); 
0

如果你不想使用動態SQL,你可以用like

UPDATE my_table 
    SET status = 'ACTIVE' 
    WHERE ',' || p_category_list || ',' like '%,' || category_id || ',%'; 

注意每邊的額外分隔符以確保1不匹配10

0

我會寫一個小功能,它通過p_category_list返回VARRAY,在這樣的功能單獨p_category_list你想要什麼,並過濾通過它來代替p_category_list在UPDATE