PL/SQL FETCH 到数据字符串

Posted

技术标签:

【中文标题】PL/SQL FETCH 到数据字符串【英文标题】:PL/SQL FETCH into data string 【发布时间】:2020-03-31 11:35:23 【问题描述】:

我是 oracle 表单的新手,我有一个问题希望您能帮助我解决。

我的问题是有没有办法将获取的数据放入数据字符串中? 例如,这里我使用 dbms_output,但有没有办法将所有行放入由 ';' 分隔的数据字符串中? 因此,理想情况下,结果应该类似于“工程师;经理;数据库分析师;”

谢谢

DECLARE 
 Job_desc varchar(100);

CURSOR cur_job is 
      SELECT job_id
from job a  where a.salary='10000';
BEGIN 
   OPEN cur_job; 
   LOOP 
   FETCH cur_job into job_desc;
      EXIT WHEN cur_job%notfound; 
      dbms_output.put_line(job_desc || ';'); 
   END LOOP; 

【问题讨论】:

【参考方案1】:

因为它是 Forms,你会做这样的事情(基于 Scott 的 EMP 表):

declare
  job_desc varchar2(100);
begin
  for cur_r in (select distinct job 
                from emp
                where sal > 1000
               )
  loop
    job_desc := job_desc ||';'|| cur_r.job;
  end loop;
end;

现在取决于你想用job_desc做什么:

在屏幕上显示为消息(两个连续的message 调用;否则,它将显示在状态行中)

end loop;
message(job_desc);
message(job_desc);

(或者,看看警报是如何工作的)

放入方块项目中:

end loop;
:block.job_description := job_desc;

但是,对于这个选项,您宁愿直接将作业放入项目中,而不是放入变量中,然后放入项目中。


不知道Forms 10是否支持listagg;如果是这样,那就更简单了:

select listagg(job, ';') within group (order by null) job_desc
from (select distinct job
      from emp
      where sal > 1000
     );

如果没有,xmlagg 工作:

select rtrim (xmlagg (xmlelement (e, job || ', ') order by job).extract 
               ('//text()'), ', ')
from (select distinct job
      from emp
      where sal > 1000
     );

所以,有很多选择;选一个。

【讨论】:

表单——甚至更高版本——不支持大多数(任何?)11g 特性,listagg 就是其中之一。还有另一种解决方法 - 您可以使用用户定义的聚合,因此您可以实现自己的 listagg(限制是您不能使用 'within group order by' 子句,您必须在实现中对 order by 子句进行硬编码),或者如果您不想实现自己的聚合,提供了未记录的 wm_concat 聚合,只要您可以使用逗号作为分隔符。 嗨,Littlefoot,你又一次救了我。我使用了第一个选项,效果很好。不幸的是,我的表单不支持 listagg。

以上是关于PL/SQL FETCH 到数据字符串的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 没有发现游标的数据异常

使用 FETCH 的 PL/SQL 游标 FOR 循环

带有游标参数 (LOOP FETCH) 和 For 循环子查询的 PL/SQL 查询出错

Oracle PL/SQL 中的字符编码问题

为了在 PL/SQL 中对这些数据进行排序,使用啥数据结构?

PL / SQL中的当前状态