Oracle procedure返回数据集小结
Oracle procedure返回数据集小结
要从Oracle Procedure获得数据集合,通常采用Ref Cursor的方式,要获得此Cursor,有以下几种方式:
1.动态Sql返回:
这种情况下,Procedure的运算通常比较简单,比如根据参数组合sql或者多个Table的Join操作,但都可以通过一个sql语句完成查询。
- CREATE OR REPLACE PROCEDURE sp_getcurrentstockpallet (
- startdate DATE,
- enddate DATE,
- status CHAR,
- material_no VARCHAR2,
- pallet_id VARCHAR2,
- box_id VARCHAR2,
- plant VARCHAR2,
- stloc VARCHAR2,
- customer VARCHAR2,
- creator VARCHAR2,
- mat_doc VARCHAR2,
- box_count NUMBER,
- RESULT OUT sys_refcursor
- )
- IS
- v_sql VARCHAR2 (1000);
- BEGIN
- v_sql :=
- 'select b.status,b.pallet_id,b.wm_pallet_id,count(b.box_id) box_count,sum(b.glass_qty) total_qty,b.unit,b.material_no,
- b.grade,a.plant,a.stloc,a.area,a.bin,b.customer,b.product_type,b.CREATE_TIME,b.remark
- from sd_current_pallet a,sd_current_box b
- where a.pallet_id=b.pallet_id ';
- IF material_no IS NOT NULL
- THEN
- v_sql := v_sql || ' and b.material_no =' || '''' || material_no || '''';
- END IF;
- v_sql :=
- v_sql
- || 'group by b.status,b.pallet_id,b.wm_pallet_id,b.unit,b.material_no,
- b.grade,a.plant,a.stloc,a.area,a.bin,b.customer,b.product_type,b.CREATE_TIME,b.remark';
- OPEN RESULT FOR v_sql ;
- EXCEPTION
- WHEN NO_DATA_FOUND
- THEN
- NULL;
- WHEN OTHERS
- THEN
- RAISE;
- END sp_getcurrentstockpallet;
2.如果Procedure逻辑运算比较复杂,没办法在一个Sql中完成。通常运算过程中需要临时存储中间运算数据等等。
这种情况下,可以采取的方式:
1)使用嵌套表动态产生数据集,并运用Table()函数返回数据集。此种方式需要在DB中创建Object,并要创建嵌套表,
本地作用域中定义的Type不能被识别。
创建Object.
- CREATE OR REPLACE TYPE stockPallet_type as object
- (
- status CHAR(1),
- material_no VARCHAR2(20),
- pallet_id VARCHAR2(30),
- box_id VARCHAR2(30),
- plant VARCHAR2(4),
- stloc VARCHAR2(4),
- customer VARCHAR2(10),
- creator VARCHAR2(10),
- mat_doc VARCHAR2(20),
- box_count NUMBER(10)
- )
创建嵌套表,类型为上面创建的Object stockPallet_type
- CREATE OR REPLACE TYPE .t_stockpallet_nest as TABLE OF stockpallet_type;
|
评论暂时关闭