要從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;