2016-09-28 172 views
1

我有n個輸入參數,以我的程序&我必須對所有這些變量執行一些操作:如何考慮價值的Varchar變量作爲新變量

代碼:

DECLARE 
p_Input1 VARCHAR2(10) := 'Nagendra'; 
p_Input2 VARCHAR2(10) :=''; 
p_Input3 VARCHAR2(10) :='Nagendra'; 
p_Input4 VARCHAR2(10) :=''; 
Temp_Input_Variable VARCHAR2(12); 
Temp_Output_Variable VARCHAR2(12); 
BEGIN 

For i IN 1..4 
Loop 
Temp_Input_Variable := 'p_Input'||i; 
IF (Temp_Input_Variable IS NOT NULL) THEN 
DBMS_OUTPUT.PUT_LINE('Variable '||Temp_Input_Variable||' Is Not Null'); 
ELSE 
DBMS_OUTPUT.PUT_LINE('Variable '||Temp_Input_Variable||' Is Null'); 
END IF; 
END LOOP; 

END; 

輸出:

Variable p_Input1 Is Not Null 
Variable p_Input2 Is Not Null 
Variable p_Input3 Is Not Null 
Variable p_Input4 Is Not Null 

預期輸出:

Variable p_Input1 Is Not Null 
Variable p_Input2 Is Null 
Variable p_Input3 Is Not Null 
Variable p_Input4 Is Null 

這裏的問題是,每當我檢查Temp_Input_Variable IS NOT NULL時,它只是檢查變量的值是否爲空,這是正確的。

但是,而不是這個,我想使用這個變量的值作爲新變量,而不是空應該應用於此。

所以Temp_Input_Variable IS NOT NULL應被視爲p_Input1 IS NOT NULL不喜歡'p_Input1' IS NOT NULL

所有這一切都在循環&避免重複工作/代碼執行所有這些操作。

請推薦。

更新: 感謝您的建議。

我有大約30個輸入&未來可能會改變。

所以我要找的是撥打像Work(P_InputN)這樣的循環,而不是調用Work(p_Input1)Work(P_Input2)等等。

即使代碼工作將是相同的,但我個人認爲與循環代碼是良好的外觀&感覺。

+2

不能動態地那樣形成一個變量。據我所知,你想動態地將一個靜態'p_inputN'變量的值賦給'Temp_Input_Variable',否則不能這樣做。其中一個選擇是使用集合。創建一個集合,集合的每個元素將代表你的'pinputN'變量,然後循環訪問該集合,將其元素分配給'Temp_Input_variable'變量,如果你真的需要的話。 –

回答

2

這聽起來像是實現目標的錯誤方式。相反,我會創建一個過程來完成實際工作,然後在相關的值傳遞的需求是這樣的:

DECLARE 
    p_input1 VARCHAR2(10) := 'Nagendra'; 
    p_input2 VARCHAR2(10) := ''; 
    p_input3 VARCHAR2(10) := 'Nagendra'; 
    p_input4 VARCHAR2(10) := ''; 

    PROCEDURE do_work (p_input IN VARCHAR2, 
        p_variable_name IN VARCHAR2) 
    IS 
    BEGIN 
    IF (p_input IS NOT NULL) 
    THEN 
    dbms_output.put_line('Variable ' || p_variable_name || 
        ' Is Not Null'); 
    ELSE 
    dbms_output.put_line('Variable ' || p_variable_name || ' Is Null'); 
    END IF; 
    END do_work; 
BEGIN 
    do_work(p_input1, 'p_input1'); 
    do_work(p_input2, 'p_input2'); 
    do_work(p_input3, 'p_input3'); 
    do_work(p_input4, 'p_input4'); 
END; 
/

Variable p_input1 Is Not Null 
Variable p_input2 Is Null 
Variable p_input3 Is Not Null 
Variable p_input4 Is Null 

另一種方法是使用一個集合:

DECLARE 
    TYPE v_assoc_array IS TABLE OF VARCHAR2(10) INDEX BY PLS_INTEGER; 
    v_tab v_assoc_array; 
    i INTEGER; 
BEGIN 
    v_tab(1) := 'Nagendra'; 
    v_tab(2) := NULL; 
    v_tab(3) := 'Nagendra'; 
    v_tab(4) := NULL; 

    i := v_tab.first; 

    WHILE i IS NOT NULL 
    LOOP 
    IF (v_tab(i) IS NOT NULL) 
    THEN 
    dbms_output.put_line('Input ' || i || 
        ' Is Not Null'); 
    ELSE 
    dbms_output.put_line('Input ' || i || ' Is Null'); 
    END IF; 

    i := v_tab.next(i); 
    END LOOP; 
END; 
/

Input 1 Is Not Null 
Input 2 Is Null 
Input 3 Is Not Null 
Input 4 Is Null 

如果沒有這些都是你以後,請與你想達到什麼樣的一個更準確的描述更新您的問題,應該把我們的位置,以更好地幫助你。

+0

謝謝。但它不是我正在尋找的。我有更多的輸入,而不僅僅是4.準確地說,大約是30.並對所有這些變量執行許多操作。所以我正在尋找可以自己調用Loop的東西。 將更新問題 –

4

如果你想要的東西可以循環使用,那麼你將需要一個數組或者可能(更復雜)的數據庫表。

declare 
    type varchar2_tt is table of varchar2(12) index by pls_integer; 
    p_input varchar2_tt; 

    temp_input_variable varchar2(12); 
begin 
    p_input(1) := 'Nagendra'; 
    p_input(2) := ''; 
    p_input(3) := 'Nagendra'; 
    p_input(4) := ''; 

    for i in 1 .. 4 loop 
     temp_input_variable := p_input(i); 

     dbms_output.put_line 
     (i || ': temp_input_variable = ''' || temp_input_variable || ''' (' || 
      case when temp_input_variable is not null then 'not ' end || 'null)'); 
    end loop; 
end; 
/

1: temp_input_variable = 'Nagendra' (not null) 
2: temp_input_variable = '' (null) 
3: temp_input_variable = 'Nagendra' (not null) 
4: temp_input_variable = '' (null) 

您可以通過字符串而不是數字來爲關聯數組編制索引,如果有幫助的話, p_input('NAME') = 'Nagendra'