如何从 PLSQL 中的函数返回一组 NUMBERS,然后在 FOR LOOP 中使用它?

Posted

技术标签:

【中文标题】如何从 PLSQL 中的函数返回一组 NUMBERS,然后在 FOR LOOP 中使用它?【英文标题】:How to return a set of NUMBERS from a Function in PLSQL and then use it in a FOR LOOP? 【发布时间】:2011-05-12 16:21:09 【问题描述】:

我想在 PLSQL 中有一个函数,它会返回一组数字,然后有一个 for 循环来遍历该数据集并对其进行处理。

有什么建议吗?该函数是否需要成为管道函数才能在 for 循环中使用?即使我只是返回数字,我是否需要创建一个新类型?

谢谢!

 CREATE OR REPLACE PACKAGE BODY someBody AS

      FUNCTION getListOfNumbers RETURN someList IS -- what type do I return ??
      BEGIN
        RETURN SELECT SID FROM V$SESSION;  -- Not sure what do here ??
      END;

      PROCEDURE soSomeStuff IS
      BEGIN
        FOR rec IN(getListOfNumbers)  -- how do I select from the function?
        LOOP
          dbms_output.put_line(rec);
        END LOOP;
      END;
  END;

【问题讨论】:

【参考方案1】:

您需要声明一个collection 类型:

SQL> CREATE OR REPLACE PACKAGE my_package AS
  2  
  3     TYPE someList IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
  4  
  5     FUNCTION getListOfNumbers RETURN someList;
  6     PROCEDURE soSomeStuff;
  7  
  8  END my_package;
  9  /

Package created

然后您可以像这样使用定义的类型:

SQL> CREATE OR REPLACE PACKAGE BODY my_package AS
  2  
  3     FUNCTION getListOfNumbers RETURN someList IS
  4        l_list someList;
  5     BEGIN
  6        SELECT SID BULK COLLECT INTO l_list FROM V$SESSION;
  7        RETURN l_list;
  8     END;
  9  
 10     PROCEDURE soSomeStuff IS
 11        l_list someList;
 12     BEGIN
 13        l_list := getListOfNumbers;
 14        FOR i IN 1..l_list.count LOOP
 15           dbms_output.put_line(l_list(i));
 16        END LOOP;
 17     END;
 18  
 19  END my_package;
 20  /

Package body created

SQL> exec my_package.soSomeStuff;

284
285
287
288
[...]
PL/SQL procedure successfully completed

【讨论】:

很好,我没想到...我最终使用了流水线函数(优点是我可以将它直接放入 forloop 即。for rec in (select * from table( getListOfNUMbers))

以上是关于如何从 PLSQL 中的函数返回一组 NUMBERS,然后在 FOR LOOP 中使用它?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 plsql 函数创建和返回游标?

plsql中的布尔算术

在一行上返回函数中的多个主键列。 PLSQL、SQL ORACLE 开发

如何从从 plsql 函数 ORACLE 返回的游标中进行选择

我们如何逐行打印字符并将其保存到 PLSQL 中的 csv 或文本文件

我应该如何使用 jdbc 从 plsql 将 varray 发送到 java? [复制]