如何将Varchar变量中的值视为新变量

时间:2016-09-28 09:29:39

标签: oracle plsql plsqldeveloper

我的程序和输入中有n个输入参数。我必须对所有这些变量执行一些操作:

代码:

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时,它只是检查is变量的值是否为空,这是正确的。

但是,不是这样,我想将此变量的值用作New变量,而不应该应用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 个答案:

答案 0 :(得分: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'

答案 1 :(得分: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

如果这些都不是你所追求的,请更新你的问题,更准确地描述你想要达到的目标,这应该让我们能够更好地帮助你。< / p>