我的程序和输入中有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)
等等。
尽管代码的工作方式是相同的,但我个人认为带循环的代码对于外观来说是好的。感觉。
答案 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>