Oracle PLSql返回值

Oracle PLSql返回值,oracle,string,plsql,Oracle,String,Plsql,我又来了一些PLSql 我想知道,是否有任何方法可以像select一样使用下面的函数,而不必将其转换为函数或过程,这样我就可以从包含它的脚本中看到代码 代码如下所示: DECLARE outpt VARCHAR2(1000) := ''; flow_rI VARCHAR2(50); CURSOR flow_r IS select flow_run_id from table where CREATED_DATE <

我又来了一些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;
想法很简单,我只想从我的表中获取一系列代码,但将结果格式化为12342434424,45767,43之类的东西,而不是查询的表结果。它将在以后的代码中用于各种目的,包括其他查询,在这些查询中,我可以简单地使用该字符串在[variable]中执行

问题是使用dbms_output.Put_lineoutpt;,我无法从我的应用层访问它,似乎在plsql中,如果不将其转换为函数,我就无法使用return

有人有主意吗?它不需要像那样的PlSql,只要我可以在脚本中包含全部代码

谢谢


f、

如果您使用的是Oralce 11 r2,您可以使用Listag来完成这项工作

但本网站提供了您在任何版本中都可以使用的方法,但您需要>=9i才能在纯SQL中使用11r2进行操作: 具体来看Oracle 9i中纯sql的行数和SYS\u CONNECT\u BY\u PATH函数,为什么不只使用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

另一种选择是定义一些输入/输出变量,而不是返回将结果值分配给输出变量。

ps:是的,我知道我有一个剩余,在字符串的开头-,我的朋友,因为我太新手了,不知道像sys\u connect\u by\u path这样的美女:非常感谢!工作起来很有魅力。f、 +1,很好的回答,很好地说明了Previor的连接。我确实在我的一张桌子上试过这个,它不会产生和OP相同的答案,但我认为这个概念是正确的,我没有时间调试它。OP。。。我认为这是可以预测的,但我有一个错误ORA-01489输出字符串太长。嗯,我认为最好在代码中处理这个问题,但是,以防万一,您对此有什么建议吗?@flpgdt,sys_connect_by_path的结果不能超过4000 char VARCHAR2限制,因此如果您需要更长的字符串,您需要编写返回CLOBI see的函数。Vincent给了我一个使用多行的sql的解决方案,这对我来说非常有效。谢谢