问题描述
各位专家好,
我们创建了以下过程,需要为此获取结果集。请在存储过程下面找到,
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;
请建议如何获得上述过程的结果集。
谢谢。
我们创建了以下过程,需要为此获取结果集。请在存储过程下面找到,
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。