我再次使用一些PLSql ..
我想知道,如果有任何方法我可以使用以下函数,如select而不必将其转换为函数或过程(因此我可以看到包含它的脚本中的代码)。
代码如下:
DECLARE
outpt VARCHAR2(1000) := '';
flow_rI VARCHAR2(50);
CURSOR flow_r IS
select flow_run_id
from table
where CREATED_DATE < sysdate - 32
and rownum < 10
order by 1 desc;
BEGIN
OPEN flow_r;
LOOP
FETCH flow_r INTO flow_rI;
EXIT WHEN flow_r%notfound;
BEGIN
outpt := outpt || ',' || flow_rI;
EXCEPTION
WHEN no_data_found THEN
dbms_output.Put_line(outpt);
END;
END LOOP;
dbms_output.Put_line(outpt);
outpt := '';
CLOSE flow_r;
END;
这个想法很简单,我只想从我的table
获取一系列代码,但结果的格式类似于"1234,2434,424,45,767,43"
,而不是查询的表结果。它将在稍后的代码中用于各种目的,包括我可以简单地执行in ([variable with that string])
的其他查询。
使用dbms_output.Put_line(outpt);
,我无法从我的应用程序层访问它,似乎在plsql中我无法使用return
而不将其转换为函数。
有人有想法吗?只要我可以在脚本中拥有整个代码,它就不需要像那样的PlSql。
谢谢!
F。
答案 0 :(得分:9)
为什么不使用sql:
SELECT MAX(ltrim(sys_connect_by_path(flow_run_id, ','), ','))
FROM
(
select flow_run_id, rownum rn
from table
where CREATED_DATE < sysdate - 32
and rownum < 10
order by 1 desc
)
START WITH rn = 1
CONNECT BY PRIOR rn = rn - 1
答案 1 :(得分:1)
如果您使用的是Oralce 11 r2,您可以使用LISTAGG完成此操作 http://download.oracle.com/docs/cd/E14072_01/server.112/e10592/functions087.htm
但是这个网站有你如何做任何版本(但你需要&gt; = 9i才能在纯SQL中做到11r2是理想的): http://www.oracle-base.com/articles/misc/StringAggregationTechniques.php(特别是在Oracle 9i中查看ROW_NUMBER()和SYS_CONNECT_BY_PATH函数以获取纯sql)
答案 2 :(得分:0)
另一种选择是定义一些输入/输出变量而不是return
将结果值分配给输出变量。
答案 3 :(得分:0)
您可以使用简单的方法 WM_CONCAT
作为解决方案。
-- It will show the output in comma separated form
-- you can change the delimiter as well if needed
-- 1234,2434,424,45,767,43
SELECT WM_CONCAT (flow_run_id)
FROM table_name
WHERE created_date < SYSDATE - 32
AND ROWNUM < 10;