我目前有两个相当长的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立即刷新,以便您可以看到脚本当前的位置?目前它只在脚本结束后才会打印出来。
感谢。
答案 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。这样就可以避免两次执行长操作的双重打击。