暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle存储过程中带有sys_refcursor的动态SQL

askTom 2017-08-28
1487

问题描述

各位专家好,

我们创建了以下过程,需要为此获取结果集。请在存储过程下面找到,

Stored Procedure:

创建或替换过程test_fetch_details (在employee.emp_id % 类型中,p_emp_cur out sys_refcursor)
作为
l_emp_id员工 _ 详细信息。emp_id % 类型;
l_select_part varchar2(1000);
l_from_part clob;
L _ where _ part varchar2(1000);
l_sql_query clob;
计数数: = 0;
l_ali作为varchar2(5);

游标cur_emp_list为
从employe_details中选择emp_id,其中emp_id = p_emp_id
emp_id desc订购;

开始
立即执行 '截断表emp_details_temp';
插入 _ emp_details_temp(p _ emp_id);
l_select_part := '从' 中选择 $ fields;
l_where_part := '其中1 = 1 $ CONDS $';
l_inner_query := '(选择字段值,字段名称从 (从insert_emp_details_temp中选择 *,其中emp_id = ''$ APP $'') 取消透视包括空值
(字段名的字段值在 (项目编号、客户名称、gt25、程序类型、交易类型、合同条款、总产品成本loc、总产品标签、总标签标签、产品标签保证金、回扣、项目网络保证金、比特责任、付款条款、国际贸易术语解释通则、客户文件、总请求部分报价、总报价、产品细节);

打开cur_emp_list;
循环
将cur_emp_list提取到l_emp_id中;
当cur_emp_list % 未找到时退出;
如果l_count = 0,则
l_ali作为:= 'A';
l_select_part := replace (l_select_part,'$FIELDS',l_ali作为|| '.fieldname 作为"EMPLOYEE"$FIELDS');
l_from_part := 替换 (l_inner_query,'$ APP',l_emp_id)| | l_alias;
其他
l_ali作为:= 'A' ||l_count;
l_where_part := 替换 (l_where_part,'$ CONDS,' 和a.fieldname = '| | l_alias | |'.fieldname $ CONDS $ ');
l_from_part := l_from_part | | ',' | | 替换 (l_inner_query,'$ APP',l_emp_id)| | l_alias;
如果结束;

l_select_part := replace (l_select_part,'$FIELDS$',','||l_alias||'.fieldvalue 作为"APP#' || l_emp_id || '"$FIELDS$' );

计数: = 计数1;

end 循环;

关闭cur_emp_list;

如果l_count = 0,则
l_sql_query := 空;
其他
l_where_part := 替换 (l_where_part,'$ conds,');

l_select_part := 替换 (l_select_part,'$ FIELDS $',');

l_sql_query := l_select_part | | l_from_part | | L_where _part;

如果结束;

打开用于l_sql_query的p_emp_cur;

异常
当其他人那么
dbms_output.put_line (sqlcode | | sqlerrm);
结束测试 _ 提取 _ detils;

请建议如何获得上述过程的结果集。

谢谢。

专家解答

您只需要一个refcursor绑定到调用中,例如

SQL> Create or replace
  2  procedure test_fetch_details (p_emp_id int, p_emp_cur out sys_refcursor) as
  3  BEGIN
  4    open p_emp_cur for select * from scott.emp where empno > p_emp_id;
  5  end ;
  6  /

Procedure created.

SQL> sho err
No errors.
SQL>
SQL>
SQL> variable rc refcursor
SQL> exec test_fetch_details(7000,:rc);

PL/SQL procedure successfully completed.

SQL>
SQL> print rc

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-DEC-80        800                    20
      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
      7566 JONES      MANAGER         7839 02-APR-81       2975                    20
      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30
      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10
      7788 SCOTT      ANALYST         7566 09-DEC-82       3000                    20
      7839 KING       PRESIDENT            17-NOV-81       5000                    10
      7844 TURNER     SALESMAN        7698 08-SEP-81       1500                    30
      7876 ADAMS      CLERK           7788 12-JAN-83       1100                    20
      7900 JAMES      CLERK           7698 03-DEC-81        950                    30
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

14 rows selected.

SQL>
SQL> exec test_fetch_details(7899,:rc)

PL/SQL procedure successfully completed.

SQL> print rc

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7900 JAMES      CLERK           7698 03-DEC-81        950                    30
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

3 rows selected.



「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论