Oracle 返回结果集 sys_refcursor

此程序通过SQL查询获取指定平台ID和店铺ID下的订单,包括等待买家付款、等待卖家发货及货到付款的状态,返回结果集并处理可能的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Oracle 返回结果集 sys_refcursor

 1     --说明:某个平台ID下某个店铺ID所有“等待买家付款”,“等待卖家发货,即买家已付款”,"货到付款"的订单结果集
 2     --作者:杨斌
 3     --日期:2012-08-29
 4 
 5     Procedure PRO_QUERY_TRADES_BY_SHOPID(
 6       prm_shop_id                 varchar2,     --店铺ID
 7       prm_platform_id             varchar2,     --平台ID
 8       out_trades       out   sys_refcursor,     --返回订单结果集
 9 
10       out_error_row   out           number,     --错误行
11       out_error_msg   out          varchar2     --错误信息
12     )
13     IS
14       str_sql varchar2(4000);--定义查询SQL语句变量
15     BEGIN
16       out_error_row :=0;--错误行
17       out_error_msg :='';--错误信息
18 
19       --查询订单信息
20       str_sql := 'select TID,SHOP_ID,PT_ID,STATUS_ID,FROM_ID,SHIP_ID,TYPE,BUYER_ID,BUYER_NAME,NUM,IS_POST,'||
21                  'PAYMENT_TIME,TOTAL_FEE,TRADE_FEE,DEAL_FEE,PAYMENT,DISCOUNT_FEE,POST_FEE,SHIPPING_TYPE,' ||
22                  'BUYER_MEMO,SELLER_MEMO,CREATE_TIME,MODIFIED_TIME,END_TIME,PAYMAENT_TYPE,BUYER_ALIPAY_NO,'||
23                  'RECEIVER_NAME,RECEIVER_STATE,RECEIVER_CITY,RECEIVER_DISTRICT,RECEIVER_ADDRESS,RECEIVER_ZIP,'||
24                  'RECEIVER_MOBILE,RECEIVER_PHONE,AVAILABLE_CONFIRM_FEE,RECEIVED_PAYMENT,INVOICE_INFO,POINT_FEE,'||
25                  'SELLER_RECVRE_FUND,BUYER_RECVRE_FUND,BUYER_OBTAIN_POINT_FEE,IS_MERGE_ORDER,WAREHOUSE,AIRLINES,'||
26                  'URGENT_TASK,URGENT_TASK_NAME,PROMOTION_NAME,PROMOTION_DISCOUNT_FEE,GIFT_ITEM_NAME,GIFT_ITEM_ID,'||
27                  'GIFT_ITEM_NUM,PROMOTION_DESC,PROMOTION_ID,TO_ERP '||
28                  'from t_xs_trade where pt_id = '''||prm_platform_id||''' and shop_id = '''||
29                   prm_shop_id ||'''  and   status_id in ('''||ST_WAIT_BUYER_PAY||''','''||ST_WAIT_SELLER_SEND_GOODS||''') or (TYPE = '''||TRADE_TYPE_COD||''' and pt_id = '''||prm_platform_id||''' and shop_id = '''||
30                   prm_shop_id ||''' )' ;
31       out_error_row :=2;--错误行
32       dbms_output.put_line(str_sql);
33       open out_trades for str_sql;
34       out_error_row :=1000;--错误行
35     exception
36       when others then
37         out_error_msg := '数据库错误:' || sqlerrm;
38 
39     END PRO_QUERY_TRADES_BY_SHOPID;

 

### 使用 OUT SYS_REFCURSOR 参数传递游标 在 Oracle PL/SQL 中,`SYS_REFCURSOR` 是一种用于表示数据库查询结果的数据类型。通过 `OUT` 参数可以将这种类型的游标从存储过程或函数返回给调用者。 #### 创建带有 OUT SYS_REFCURSOR 的存储过程 定义一个简单的存储过程来演示如何声明并打开 `SYS_REFCURSOR` 类型的输出参数: ```plsql CREATE OR REPLACE PROCEDURE get_employee_data ( p_deptno IN NUMBER, emp_cursor OUT SYS_REFCURSOR ) IS BEGIN OPEN emp_cursor FOR SELECT ename, job, hiredate FROM emp WHERE deptno = p_deptno; END; / ``` 此代码创建了一个名为 `get_employee_data` 的存储过程,它接受部门编号作为输入,并通过 `emp_cursor` 返回该部门员工的信息[^1]。 #### 调用带 OUT SYS_REFCURSOR 参数的过程 为了展示如何接收来自上述存储过程的结果,在客户端应用程序中可以通过绑定变量的方式处理这个游标对象。下面是一个匿名PL/SQL块的例子,展示了如何调用上面定义好的存储过程并将获取到的数据打印出来: ```plsql DECLARE v_emp_cur SYS_REFCURSOR; v_ename VARCHAR2(50); v_job VARCHAR2(50); v_hiredate DATE; BEGIN -- 调用存储过程 get_employee_data(p_deptno => 10, emp_cursor => v_emp_cur); LOOP FETCH v_emp_cur INTO v_ename, v_job, v_hiredate; EXIT WHEN v_emp_cur%NOTFOUND; DBMS_OUTPUT.PUT_LINE('Name: ' || v_ename || ', Job: ' || v_job || ', Hire Date:'|| TO_CHAR(v_hiredate,'DD-MON-YYYY')); END LOOP; CLOSE v_emp_cur; END; / ``` 这段脚本首先声明了一个 `SYS_REFCURSOR` 变量 `v_emp_cur` 来保存由 `get_employee_data` 过程传回的游标数据;接着在一个循环里逐行取出记录直到没有更多行为止;最后关闭游标完成操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值