【问题标题】:how to loop through listagg如何循环遍历listagg
【发布时间】:2019-01-28 09:20:50
【问题描述】:

您能帮我找到解决以下问题的最佳方法吗?

问题:我有一个 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

【问题讨论】:

    标签: oracle plsql oracle-apex


    【解决方案1】:

    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 不是主键吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      • 2021-12-07
      • 2020-07-28
      • 2012-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多