【问题标题】:Access out parameters of a procedure from another procedure in oracle从oracle中的另一个过程中取出一个过程的参数
【发布时间】:2015-11-24 12:23:54
【问题描述】:

我有一个使用 select 语句返回一些列的过程:

CREATE OR REPLACE PROCEDURE test_ref(
           OUT_RESULT         OUT SYS_REFCURSOR )
        AS
        BEGIN
          OPEN OUT_RESULT FOR 
            SELECT NAME,AGE,CODE FROM SOMETABLE;
        END;

我需要访问这个过程并从 select 语句中获取值

create or replace 
PROCEDURE TESTPROC AS 
OUT_RESULT sys_refcursor;
BEGIN
 test_ref(OUT_RESULT);
END TESTPROC;

如何循环并从 OUT_RESULT 中获取姓名、年龄、代码?

类似:

LOOP
         FETCH out_result INTO SOMETHING;
         EXIT WHEN out_result%NOTFOUND;
      END LOOP;

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    你快到了。你想做的是:

    1. 获取 (FETCH) 查询的结果集(SYS_REFCURSOR 是指向查询的指针)。
    2. 通过将结果放入记录(逐行)或集合中,从结果集中获取您需要的列。

    我建议将批量收集到集合中,因为批量操作总是更有效。集合示例 (source):

    SQL> declare
      2    TYPE t_clientID_nt IS TABLE OF dual%rowtype;  --TYPE <type_name> IS TABLE OF <record_name>
      3    clientID_nt t_clientID_nt;  --Create a variable for the table type
      4  
      5    l_cur sys_refcursor;
      6  
      7    procedure OpenAndPopulateCursor(p_cur in out sys_refcursor) is
      8    begin
      9      open p_cur for
     10        select *
     11         from dual;
     12    end;
     13  
     14  begin
     15    OpenAndPopulateCursor(l_cur);  --Returns your SYS_REFCURSOR via IN OUT parameter
     16  
     17    if l_cur%isopen
     18    then
     19      fetch l_cur bulk collect into clientID_nt;  --Bulk collecting into the table variable (collection) we created above
     20    end if;
     21  
     22    dbms_output.put_line(concat( to_char(clientID_nt.count) 
     23                               , ' record(s) has/have been fetched.'));
     24  end;
     25  /
    

    如果您出于某种原因需要使用逐行提取 (source):

    DECLARE
      l_cursor  SYS_REFCURSOR;
      l_ename   emp.ename%TYPE;
      l_empno   emp.empno%TYPE;
      l_deptno  emp.deptno%TYPE;
    BEGIN
      get_emp_rs (p_deptno    => 30,
                  p_recordset => l_cursor);
    
      LOOP 
        FETCH l_cursor
        INTO  l_ename, l_empno, l_deptno;
        EXIT WHEN l_cursor%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(l_ename || ' | ' || l_empno || ' | ' || l_deptno);
      END LOOP;
      CLOSE l_cursor;
    END;
    /
    

    【讨论】:

    • 谢谢一百万兄弟。你是救世主
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多