我的部分程序是这样的:
declare
v_cnt_1 number;
v_cnt_2 number;
begin
with input1 as(
select .........
from...
where.....)
select count(*) into v_cnt_1
from input1 t
where......);
with input2 as(
select .........
from...
where.....)
select count(*) into v_cnt_2
from input2 t
where......);
IF v_cnt_1 >0 or v_cnt_2 >0
THEN DBMS_OUTPUT.PUT_LINE('all set');
ELSE DBMS_OUTPUT.PUT_LINE('take further action');
end if;
end;
我的目标是:如果此查询返回“采取进一步操作”的结果,那么我必须实现其他步骤,如果进一步if / else语句。如果返回'采取进一步行动',我还有四个情况(if / else)要添加。如何在此输出的基础上添加if / else?或者我是否需要创建另一个过程并在新过程中调用此过程?
答案 0 :(得分:0)
declare
v_cnt_1 number;
v_cnt_2 number;
Take_further_action boolean:=False;
begin
with input1 as(
select .........
from...
where.....)
select count(*) into v_cnt_1
from input1 t
where......);
with input2 as(
select .........
from...
where.....)
select count(*) into v_cnt_2
from input2 t
where......);
IF v_cnt_1 >0 or v_cnt_2 >0
THEN DBMS_OUTPUT.PUT_LINE('all set');
ELSE Take_futher_action :=True;
v_cnt_1 :=0;
v_cnt_2 :=0;
--DBMS_OUTPUT.PUT_LINE('take further action');
end if;
--Now put your select into statments here
IF (v_cnt_1 >0 or v_cnt_2 >0) and Take_further_action
THEN DBMS_OUTPUT.PUT_LINE('all set');
Take_further_action :=False;
ELSE Take_further_action :=True;
v_cnt_1 :=0;
v_cnt_2 :=0;
--DBMS_OUTPUT.PUT_LINE('take further action');
end if;
--Now again put your select into statments here
IF (v_cnt_1 >0 or v_cnt_2 >0) and Take_further_action
THEN DBMS_OUTPUT.PUT_LINE('all set');
Take_further_action :=False;
ELSE Take_further_action :=True;
v_cnt_1 :=0;
v_cnt_2 :=0;
end if;
--You can perform any number of check with if-then-else as per required
end;
答案 1 :(得分:0)
"如果此查询返回结果,请采取进一步措施'那么我必须实现其他步骤,如果进一步if / else语句。 "
我们可以嵌套IF语句。您不能说出您的进一步陈述,但您的代码可能如下所示:
...
IF v_cnt_1 >0 or v_cnt_2 >0
THEN DBMS_OUTPUT.PUT_LINE('all set');
ELSE
-- take further action
if whatever = 0 then
DBMS_OUTPUT.PUT_LINE('do something #1');
elsif whatever > 0 and yeahyeah = 0 then
DBMS_OUTPUT.PUT_LINE('do something #2');
elsif whatever > 0 and yeahyeah > 0 then
DBMS_OUTPUT.PUT_LINE('do something #3');
end if;
end if;
如果这是您所需要的,您也可以将其构建为CASE声明:
case
when v_cnt_1 >0 or v_cnt_2 >0 then
DBMS_OUTPUT.PUT_LINE('all set');
when whatever = 0 then
DBMS_OUTPUT.PUT_LINE('do something #1');
when whatever > 0 and yeahyeah = 0 then
DBMS_OUTPUT.PUT_LINE('do something #2');
when whatever > 0 and yeahyeah > 0 then
DBMS_OUTPUT.PUT_LINE('do something #3');
else
DBMS_OUTPUT.PUT_LINE('Unexpected state');
end case;
请注意,CASE和ID / ELSIF评估会短路。这意味着程序首先执行第一个匹配条件,因此我们需要在一般情况之前具有特定情况。这不好:
case
when whatever = 0 and yeahyeah > 0 then
dbms_output.put_line('do something');
when whatever = 0 and yeahyeah = 1 then
dbms_output.put_line('will never execute');
"我是否需要创建另一个过程并在新过程"
中调用此过程
不确定你的问题是什么驱动,但如果执行的步骤很复杂(比如几行代码),调用程序会更清晰 - 它们可以是本地的 - 因为它是只是更容易阅读整个程序。在骨架代码中看起来像:
declare
v_cnt_1 number;
v_cnt_2 number;
...
procedure proc1(p1 number) is
...
end p1;
procedure proc2(p1 number) is
...
end p2;
begin
...
case
when v_cnt_1 >0 or v_cnt_2 >0 then
null -- 'all set';
when whatever = 0 then
proc1(v_cnt_1);
when whatever > 0 and yeahyeah = 0 then
proc1(v_cnt_2);
when whatever > 0 and yeahyeah > 0 then
proc1(v_cnt_1);
proc2(v_cnt_2);
else
proc3(42);
end case;
这样很容易理解整个case语句,看看哪个条件触发了哪个动作。当然,为程序提供有意义的名称有助于理解这一点(对于30个字符的Oracle命名限制并不总是很容易)。