如何遍历listagg

时间:2019-01-26 08:33:48

标签: oracle plsql oracle-apex

能否请您帮我解决以下问题的最佳方法?

问题:我有一个oracle apex页面,其中有一个报告,其中包含列作为部门名称和员工名称以及复选框。选择一个或多个复选框并单击“提交”按钮后,就会发生此情况。

  1. pl / sql代码应从emp表中获取所有选定行的部门名称。
  2. 接下来,它应该为选定的复选框获取每个部门下的雇员名称。

完成此操作的最佳方法是什么?

下面是我的代码。

    FOR i in 1..APEX_APPLICATION.G_F01.count
    LOOP
    IF APEX_APPLICATION.G_F01(i) IS NOT NULL THEN
      select listagg(dept_name,',') WITHIN GROUP (ORDER BY 
      TESTSET_PATH) into str_dept_names from emptable
      WHERE 
      emptable._ID=APEX_APPLICATION.G_F01(i) group by dept_name;
     END IF;   
    END LOOP;


    FOR REC IN str_dept_names
    LOOP
      FOR i in 1..APEX_APPLICATION.G_F01.count
       LOOP
       IF APEX_APPLICATION.G_F01(i) IS NOT NULL THEN
          select  listagg(ename,',') WITHIN GROUP (ORDER BY 
          dept_name) into str_enums from 
          emptable where dept_name LIKE 
          (rec.str_dept_names) and 
          emptable .ID 
         =APEX_APPLICATION.G_F01(i);

        myclob:=-myclob||'java -jar test.jar - 
        dept'||rec.str_dept_names||str_testnums;

        END IF;
     END LOOP;
     END LOOP;

我在myclob中的输出应为:deptA,emp1,emp2

1 个答案:

答案 0 :(得分:0)

在Apex 5中添加的apex_string程序包可与嵌套表一起使用,而嵌套表可与SQL很好地配合使用。缺点是您必须进行转换。所以我通常这样做,以避免循环:

if apex_application.g_f01.count > 0 then
    l_dept_ids := apex_string.split( apex_util.table_to_string( 
        apex_application.g_f01 ), ':' );

    select listagg(dept_name,',') WITHIN GROUP (ORDER BY 
           TESTSET_PATH) into str_dept_names 
      from emptable
     WHERE emptable._ID MEMBER OF l_dept_ids
end if;

我不确定我是否足够理解您的第二个查询。您正在使用LIKE子句,但这似乎很奇怪。 id不是主键吗?