Amalgamate 2选择语句为1

时间:2010-02-05 10:18:14

标签: sql oracle oracle10g

我目前有两个相当长的select语句,除了第一个是通过count(*)查看行是否存在以及第二个基于if语句将行选择到rowtype变量这一事实之外。这是因为进一步操作需要数据

我知道这是可能的,但我有一个完整的脑热,谷歌会返回大量关于选择的信息,如果/其他但不是基于选择的分支。

我尝试将if包装在if语句中并失败,所以我想知道还有什么可以尝试。

更新:Psuedo-example:

select count(*) into num_items where <very long operation>;
if (num_items = 1) then
  begin
  select * into row_item where <very long operation>;
  end;
else
  dbms_output.put_line('failure');
end if;

:在一个稍微不相关的说明中,如何让dbms_output立即刷新,以便您可以看到脚本当前的位置?目前它只在脚本结束后才会打印出来。

感谢。

3 个答案:

答案 0 :(得分:4)

我认为您想要的代码是:

begin
  select * into row_item where <very long operation>;
exception
  when too_many_rows then
    dbms_output.put_line('failure');
end;

dbms_output在开发代码或从SQL Plus或IDE运行的SQL脚本时,只对调试有用。您可以使用自治事务将消息写入表;然后,当程序仍在运行时,可以通过另一个会话读取这些内容。有关详细信息,请参阅this question

答案 1 :(得分:1)

我想你想要SELECT CASE

如果您需要更具体的帮助,请发布您当前的代码。

答案 2 :(得分:1)

我会考虑这样的事情:

DECLARE
  CURSOR c IS
    SELECT COUNT(*) OVER () count_rows,
    q.* FROM (<very long operation>) q
    WHERE ROWNUM <= 2;
  r c%ROWTYPE;
BEGIN
  OPEN c;
  FETCH c INTO r;
  IF c%NOTFOUND OR r.count_rows != 1 THEN
    dbms_output.put_line('failure');
  ELSE
    --process the row
  END IF;
END;

这将从“非常长的操作”中计算最多2条记录;但只会获取第一行。如果只找到一行,则r.count_rows为1,如果找到多于1行,则为2。这样就可以避免两次执行长操作的双重打击。