当我在一个过程中调用package.function,函数返回值在游标中,我如何将这些值存储在Oracle SQL的过程变量中?

af7jpaap  于 2023-05-22  发布在  Oracle
关注(0)|答案(1)|浏览(135)

PKG_LIST_LOG.abc(package.function)返回一个类似{<PR=100:ORA-01403:无数据,SC=ORA-01403:没有找到数据,PSC=sp_ls:LA,EXEC_DATE=04-MAY-23>,}那么我如何在下面的过程中存储此信息并打印结果。

CREATE OR REPLACE PROCEDURE LIST_LOG(name VARCHAR2, id VARCHAR2, label VARCHAR2)
IS
    v_query VARCHAR2(4000);
    v_cursor SYS_REFCURSOR;
    v_result VARCHAR2(4000);
BEGIN   
    CASE label
        WHEN 'abc' THEN
          v_query := 'SELECT PKG_LIST_LOG.abc('''||name||''','''||id||''','''||label||''') FROM DUAL';
          OPEN v_cursor FOR v_query;
          FETCH v_cursor INTO v_result;
--            EXECUTE IMMEDIATE v_query INTO v_result;
            DBMS_OUTPUT.PUT_LINE(v_result);
    ELSE
        DBMS_OUTPUT.PUT_LINE('INVALID PARAMETERS');
    END CASE;
END;
/
qkf9rpyu

qkf9rpyu1#

按照我的理解,你应该把abc函数的结果放到v_cursor中。
由于我没有您的表和数据(您也没有发布任何其他信息),这里有一个基于Scott的示例模式的示例。
函数返回ref游标:

SQL> create or replace function abc(p_deptno in number, p_job in varchar2)
  2    return sys_refcursor
  3  is
  4    rc sys_refcursor;
  5  begin
  6    open rc for select ename, sal
  7    from emp
  8    where deptno = p_deptno
  9      and job = p_job;
 10    return rc;
 11  end;
 12  /

Function created.

过程调用该函数;第7章这就是你要做的在你的代码中没有任何动态的东西,所以你不需要编写一个调用函数的select语句,你也不应该打开一个游标--只需要使用函数返回的内容:

SQL> create or replace procedure list_log(p_deptno in number, p_job in varchar2)
  2  is
  3    v_cursor sys_refcursor;
  4    v_ename  emp.ename%type;
  5    v_sal    emp.sal%type;
  6  begin
  7    v_cursor := abc(p_deptno, p_job);
  8    loop
  9      fetch v_cursor into v_ename, v_sal;
 10      exit when v_cursor%notfound;
 11      dbms_output.put_line(v_ename ||' '|| v_sal);
 12    end loop;
 13    close v_cursor;
 14  end;
 15  /

Procedure created.

测试:

SQL> set serveroutput on
SQL> exec list_log(20, 'CLERK');
SMITH 840
ADAMS 1100

PL/SQL procedure successfully completed.

这个输出是否正确?看起来像是:

SQL> select ename, sal from emp where deptno = 20 and job = 'CLERK';

ENAME             SAL
---------- ----------
SMITH             840
ADAMS            1100

SQL>

相关问题