【发布时间】:2017-08-10 12:13:22
【问题描述】:
我们有一个select 语句,它根据开关的不同而不同。然后我们循环遍历结果。
目前代码如下:
if switch_a then
for rec in
(
select *
order by decode(x, y,1,0),
decode(x,a,2,0),
decode(x,z,3,0), pos
)
loop ...
end loop;
else
for rec in
(
select *
order by decode(x, y,1,0),
decode(x,z,3,0), pos
)
loop ...
end loop;
end if;
现在我想将该代码转换为只有一个循环。所以我选择:
if (switch_a) then
Statement call := select*...
else
Statement call := select*...
end if;
for rec in call
loop
end loop;
问题是,我不知道这是否适用于 for rec in 并且我不知道如何定义可执行的 SQL 语句。这可能吗?如果可以,你能举个例子吗?
【问题讨论】:
-
似乎是解决方案的一部分。但是我必须在函数之外定义游标,这将不允许根据我从 If 子句获得的结果用两个不同的语句填充同一个游标。这将导致我仍然必须使用两个不同的循环,并且我不会获得更清晰的代码。我错过了什么吗?
-
只是您的查询中的顺序不同吗?您的示例中没有包含 from 和 where 子句,因此很难判断。 I3rutt 的答案的替代方法是将两个循环中的所有逻辑拉到一个单独的过程中(带有必要的参数),然后您只需要从两个循环内部调用该过程。
-
该语句仅在“order by”部分有所不同。如果开关为真,则有一个额外的按条件排序,