循环的条件执行

问题描述 投票:0回答:3

我有以下 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

我怎样才能实现这个目标?

sql oracle plsql
3个回答
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;

退出将打破循环。 有关更多信息,请参阅文档:http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/exit_statement.htm

另一种方法是使你的 test_proc 过程无效证明,但话又说回来,我真的不知道你想做什么;)


1
投票

product_cats_nos 不能为 null(它可以包含 null 或为空,但这是一个不同的概念:集合在作为收集聚合函数的第一步初始化时不为 null)并且只能拥有最后一个 一个(您按该字段进行分组)pm.product_holder 的出现(因为当您使用 order by 时默认最后一个为 null)为 null。 鉴于此,您可以简单地修改查询,添加一个 where 子句 Product_holder 不为空。


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 语句更清晰 - 但您可以选择您喜欢的方法。

© www.soinside.com 2019 - 2024. All rights reserved.