我有以下 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中,如果任何一列为空,我不想执行循环,它应该终止执行。
列是
product_holder,product_cats_nos
我怎样才能实现这个目标?
你应该能够这样做:
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;
退出将打破循环。 有关更多信息,请参阅文档:http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/exit_statement.htm
另一种方法是使你的 test_proc 过程无效证明,但话又说回来,我真的不知道你想做什么;)
product_cats_nos 不能为 null(它可以包含 null 或为空,但这是一个不同的概念:集合在作为收集聚合函数的第一步初始化时不为 null)并且只能拥有最后一个 一个(您按该字段进行分组)pm.product_holder 的出现(因为当您使用 order by 时默认最后一个为 null)为 null。 鉴于此,您可以简单地修改查询,添加一个 where 子句 Product_holder 不为空。
看起来 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 语句更清晰 - 但您可以选择您喜欢的方法。