我有以下plsql块
for holder in (
select pm.product_holder
, cast(
collect(
product_table(pm.product_no,pm.product_catalogue)
order by pm.product_catalogue
, pm.product_no
) as t_prod_cat_no_table
) product_cats_nos
from product_master pm
group by pm.product_holder
order by pm.product_holder
) loop
test_proc(
holder.product_holder,
holder.product_cats_nos
);
end loop;
在上面的sql中,如果列中的任何一个为null,我不想执行循环,它应该终止执行。
列为product_holder,product_cats_nos
我怎么能实现这个目标?
答案 0 :(得分:1)
你应该能够这样做:
loop
if holder.product_holder is null or
holder.product_cats_nos is null
then
exit;
end if;
test_proc(
holder.product_holder,
holder.product_cats_nos
);
end loop;
退出将打破循环。 有关详细信息,请查看文档:{{3}}
另一种方法是让你的test_proc程序为空证明,但是我再也不知道你想做什么了;)
答案 1 :(得分:1)
PRODUCT_NO似乎是PRODUCT_MASTER上的一列,而PRODUCT_CAT_NOS是查询生成的对象。鉴于此,似乎要测试这两个列/对象的NULL状态,你想要测试WHERE子句中的第一个,以及HAVING子句中的第二个:
for holder in (
select pm.product_holder
, cast(
collect(
product_table(pm.product_no,pm.product_catalogue)
order by pm.product_catalogue
, pm.product_no
) as t_prod_cat_no_table
) product_cats_nos
from product_master pm
WHERE pm.PRODUCT_HOLDER IS NOT NULL -- Added
group by pm.product_holder
HAVING PRODUCT_CAT_NOS IS NOT NULL -- Added
order by pm.product_holder
) loop
test_proc(
holder.product_holder,
holder.product_cats_nos
);
end loop;
但总的来说,我认为在循环中使用IF语句会更清楚 - 但您可以选择自己喜欢的方法。
分享并享受。
答案 2 :(得分:1)
product_cats_nos不能为null(它可以包含空值或为空,但这是一个不同的概念:集合在初始化为收集聚合函数的第一步时不为空)并且您只能拥有最后一个(您按该字段进行分组)pm.product_holder的出现(因为当您使用order by时,空值是最后一个默认值)为null。 鉴于此,您可以简单地修改添加where子句的查询 product_holder不为空。