1. 程式人生 > >關於oracle中procedure和function返回cursor型別的變數

關於oracle中procedure和function返回cursor型別的變數

/*
請使用scott/tiger使用者下的emp表進行測試
*/
/*
注意:
在使用遊標作為返回值時,要注意再動態繫結時開啟遊標,然後返回。
在使用時直接使用遊標,不需要再次開啟,故而只能使用傳統的open/close方式來使用遊標,
for迴圈使用遊標時,會牽扯到開啟遊標,會出現重複開啟的錯誤,所以不能使用。
*/

–在過程中返回型別為遊標變數型別
CREATE OR REPLACE PROCEDURE findset_emp(v_deptno IN NUMBER,
c_cursor OUT SYS_REFCURSOR) AS
BEGIN
OPEN c_cursor FOR –開啟遊標,在建立過程中繫結
SELECT *
FROM emp
WHERE deptno = v_deptno;
END;
–測試過程返回遊標型別是否正確
DECLARE v_cur SYS_REFCURSOR; emp_rec emp%ROWTYPE;
BEGIN
findset_emp(10, v_cur); LOOP FETCH v_cur INTO emp_rec; EXIT WHEN v_cur%NOTFOUND; dbms_output.put_line(‘—————’);
END LOOP; CLOSE v_cur;
END;
–建立函式,返回值為遊標型別
CREATE OR REPLACE FUNCTION return_cur_test(v_deptno VARCHAR2) RETURN SYS_REFCURSOR IS
type_cur SYS_REFCURSOR;
BEGIN
OPEN type_cur FOR SELECT * FROM emp WHERE deptno = v_deptno; RETURN type_cur;
END;

–測試是否正確
DECLARE v_cur SYS_REFCURSOR; emp_rec emp%ROWTYPE;
BEGIN
v_cur := return_cur_test(&deptno);

LOOP EXIT WHEN v_cur%NOTFOUND; FETCH v_cur INTO emp_rec; dbms_output.put_line(‘—————’);
END LOOP; CLOSE v_cur;
END;