【问题标题】:SQL Stored Procedure data type for list of rows行列表的 SQL 存储过程数据类型
【发布时间】:2019-12-06 00:56:13
【问题描述】:

我可以使用什么数据类型来存储 SELECT 查询找到的所有行?

CREATE OR REPLACE PROCEDURE handleFailedCalls(xNumber in varchar(10)) AS
result {DATA TYPE I WANT};
BEGIN
   select * into result
   from CALLS c1
   where c1.status = 'fail'
END
/

【问题讨论】:

    标签: sql oracle stored-procedures oracle11g multiple-return-values


    【解决方案1】:

    一种方法是使用OUT 类型的REFCURSOR 变量。

    CREATE OR REPLACE PROCEDURE handleFailedCalls(xNumber in varchar2,
    p_result OUT SYS_REFCURSOR
    ) AS
    BEGIN
       OPEN p_result FOR select * from CALLS c1
       where c1.status = 'fail'
    END
    /
    

    另外,使用VARCHAR2 代替VARCHAR。它应该没有大小,因为带有大小的过程参数将无法编译。

    可以调用该过程将光标接收到本地ref cursor变量中。

    DECLARE
    res_cur SYS_REFCURSOR;
    BEGIN
        handleFailedCalls('Xnumber1', res_cur );
    END;
    /
    

    【讨论】:

      【解决方案2】:

      使用BULK COLLECT,例如:

      DECLARE
      TYPE emp_typ IS TABLE OF employees%ROWTYPE INDEX BY PLS_INTEGER;
      all_employees emp_typ;
      BEGIN
      SELECT * BULK COLLECT INTO all_employees FROM employees;
      

      SELECT ... BULK COLLECT INTO 语句可以返回多行。您必须设置集合变量来保存结果。您可以声明关联数组或嵌套表,它们会根据需要增长以容纳整个结果集。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-09
      • 2019-10-02
      • 2012-12-16
      • 1970-01-01
      • 2014-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多