【问题标题】:PLSql return valuesPLSql 返回值
【发布时间】:2010-10-14 14:16:49
【问题描述】:

我又来了一些 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.

【问题讨论】:

  • ps.:是的,我知道我在字符串的开头有一个剩余的“,”-_-

标签: oracle string plsql


【解决方案1】:

为什么不只使用 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

【讨论】:

  • 那位朋友,是因为我太新手,不知道sys_connect_by_path这样的美女:) 非常感谢!奇迹般有效。 f.
  • +1,很好的答案,CONNECT BY PRIOR 的很好说明。我确实在我拥有的桌子上尝试过,它不会产生与 OP 相同的答案,但我认为这个概念是正确的,我没有时间调试它。
  • ops...我认为这是可以预测的,但我收到了这个错误ORA-01489(输出字符串太长)。好吧,我认为在代码中处理它会更好,但是,以防万一,您对此有什么建议吗?
  • @flpgdt,sys_connect_by_path 的结果不能超过 4000 个字符(VARCHAR2 限制)所以如果你需要更长的字符串,你需要编写返回 CLOB 的函数
  • 我明白了。文森特给了我一个关于 sql 的解决方法(使用多行,这为我解决了)stackoverflow.com/questions/3975967/… 工作得非常棒。谢谢!
【解决方案2】:

如果您在 Oralce 11 r2 上,您可以使用 LISTAGG 来执行此操作 http://download.oracle.com/docs/cd/E14072_01/server.112/e10592/functions087.htm

但是这个站点有你如何在任何版本中执行它(但是你需要 >=9i 才能在纯 SQL 中执行它,11r2 是理想的): http://www.oracle-base.com/articles/misc/StringAggregationTechniques.php(具体看 Oracle 9i 中的 ROW_NUMBER() 和 SYS_CONNECT_BY_PATH 函数以获得纯 sql)

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      您可以使用简单的方法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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-25
        • 1970-01-01
        • 2022-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多