合并 2 选择语句为 1
Posted
技术标签:
【中文标题】合并 2 选择语句为 1【英文标题】:Amalgamate 2 select statements into 1 【发布时间】:2010-02-05 10:18:14 【问题描述】:我目前有两个相当长的 select 语句,除了第一个是通过 count(*) 查看该行是否存在,第二个是根据 if 语句将行选择到 rowtype 变量之外这一点是相同的。这是因为数据需要进一步处理
我知道这是可能的,但我的大脑完全冻结了,谷歌返回了很多关于 select 和 if/else 的信息,但不是基于 select 的分支。
我尝试将 select 包装在 if 语句中但失败了,所以我想知道还有什么可以尝试的。
更新:伪示例:
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 立即刷新,以便您可以看到脚本当前的状态?目前它只在脚本结束后打印。
谢谢。
【问题讨论】:
【参考方案1】:我想你想要的代码是这样的:
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。
【讨论】:
【参考方案2】:我想你想要SELECT CASE。
如果您需要更具体的帮助,请发布您当前的代码。
【讨论】:
这行不通,因为 case 语句在 select 内部。我需要检查select是否返回了rowdata类型的数据。 看来我不公平,不明白你在说什么。现在我已经阅读了更多内容,这是有可能的。【参考方案3】:我会考虑这样的事情:
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。这样可以避免执行两次长操作的双重打击。
【讨论】:
以上是关于合并 2 选择语句为 1的主要内容,如果未能解决你的问题,请参考以下文章