Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
合理选择。。。针对多行或无行的情况,将其导入Oracle解决方案_Oracle - Fatal编程技术网

合理选择。。。针对多行或无行的情况,将其导入Oracle解决方案

合理选择。。。针对多行或无行的情况,将其导入Oracle解决方案,oracle,Oracle,我只想从过程内部将值选择到变量中 选择blah1、blah2进入var1、var2_ 从 有时大型复杂查询将没有行,有时它将有多个行-这两种情况都会导致异常。我很想用类似于以下内容的隐式行为替换异常行为: 无行=无值更改,多行=最后使用 对于多行的情况,我可以很容易地约束结果集,但是对于无法在SELECT中使用聚合函数的情况,没有行要困难得多 有什么特别的解决办法或建议吗?希望避免在执行SELECT INTO之前显著重写查询或执行两次以获取行数。使用异常块有什么问题 create or re

我只想从过程内部将值选择到变量中

选择blah1、blah2进入var1、var2_ 从

有时大型复杂查询将没有行,有时它将有多个行-这两种情况都会导致异常。我很想用类似于以下内容的隐式行为替换异常行为:

无行=无值更改,多行=最后使用

对于多行的情况,我可以很容易地约束结果集,但是对于无法在SELECT中使用聚合函数的情况,没有行要困难得多


有什么特别的解决办法或建议吗?希望避免在执行SELECT INTO之前显著重写查询或执行两次以获取行数。

使用异常块有什么问题

  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> 

使用异常块有什么问题

  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> 

您可以使用for循环。for循环不会对没有返回的行执行任何操作,如果有多行,则会应用于返回的每一行。您可以调整选择,使其仅返回最后一行

begin   
    for ARow in (select *
                  from tableA ta
                  Where ta.value = ???) loop                           
        -- do something to ARow
    end loop;   
end;

您可以使用for循环。for循环不会对没有返回的行执行任何操作,如果有多行,则会应用于返回的每一行。您可以调整选择,使其仅返回最后一行

begin   
    for ARow in (select *
                  from tableA ta
                  Where ta.value = ???) loop                           
        -- do something to ARow
    end loop;   
end;

您还可以将查询声明为游标、打开它、提取一次并检查%found属性。您还可以将查询声明为游标、打开它、提取一次并检查%found属性。