条件执行循环

时间:2015-03-01 15:28:44

标签: sql oracle plsql

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

我怎么能实现这个目标?

3 个答案:

答案 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不为空。