我只想将值从过程内部变为SELECT变量。
SELECT blah1,blah2 INTO var1_,var2_ 来自......
有时,大型复杂查询将没有行,有时它会有多个 - 两种情况都会导致异常。我希望用类似的隐式行为替换异常行为:
没有行=没有值更改,多行=使用最后
对于“多行”情况,我可以很容易地约束结果集,但对于无法在SELECT中使用聚合函数的情况,“无行”会更加困难。
是否有任何特殊的解决方法或建议?在执行SELECT INTO之前,希望避免显着重写查询或执行两次以获取行数。
答案 0 :(得分:5)
使用异常块有什么问题?
create or replace
procedure p(v_job VARCHAR2) IS
v_ename VARCHAR2(255);
begin
select ename into v_ename
from (
select ename
from scott.emp
where job = v_job
order by v_ename desc )
where rownum = 1;
DBMS_OUTPUT.PUT_LINE('Found Rows Logic Here -> Found ' || v_ename);
EXCEPTION WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No Rows found logic here');
end;
SQL> begin
p('FOO');
p('CLERK');
end; 2 3 4
5 /
No Rows found logic here
Found Rows Logic Here -> Found SMITH
PL/SQL procedure successfully completed.
SQL>
答案 1 :(得分:1)
你可以使用for循环。对于没有返回的行,for循环将不执行任何操作,并且如果存在多个行,则将应用于返回的每一行。您可以调整您的选择,使其仅返回最后一行。
begin
for ARow in (select *
from tableA ta
Where ta.value = ???) loop
-- do something to ARow
end loop;
end;