2010-10-14 115 views
3

在这里,我与一些PLSQL再次去..PLSQL返回值

我想知道,如果有什么办法,我可以用这样一个选择以下功能,而不必把它变成一个函数或过程(所以我可以从包含它的脚本中看到代码)。

的代码将是这样的:

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

ps .:是的,我知道我有一个剩余的“,”在字符串的开头-_- – filippo 2010-10-14 14:18:43

回答

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 
+0

那我的朋友,是因为我太新手了,不知道像'sys_connect_by_path'这样的美女:)非常感谢你许多!奇迹般有效。 F。 – filippo 2010-10-14 15:02:47

+0

+1,很好的答案,很好的说明CONNECT BY PRIOR。我在一张桌子上尝试过这种方法,但它不会产生与OP相同的答案,但我认为这个概念是正确的,我没有时间去调试它。 – DCookie 2010-10-14 15:39:56

+0

ops ...我认为这将是可预测的,但我有这个错误'ORA-01489'(输出字符串太长)。那么,我认为在代码中处理这个问题会更好,但为了以防万一,你会对此有何建议? – filippo 2010-10-19 17:02:38

0

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