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 到数据字符串的主要内容,如果未能解决你的问题,请参考以下文章
带有游标参数 (LOOP FETCH) 和 For 循环子查询的 PL/SQL 查询出错