PLSql返回值

时间:2010-10-14 14:16:50

标签: 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 < 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。

4 个答案:

答案 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;