PLSQL Language Referenc-PL/SQL靜態SQL-游標變數-游標變數作為子程式引數

LuiseDalian發表於2014-03-16

游標變數作為子程式引數

游標變數可以作為子程式引數用於在子程式之間傳遞查詢結果集:

可以在一個子程式中開啟游標變數,在其它的子程式中處理它。

在多語言應用中,PL/SQL子程式可以使用游標變數返回查詢結果給用其它語言寫的子程式。

注意:呼叫和被呼叫的子程式需要位於相同的資料庫例項中,不能向通過資料庫鏈呼叫的子程式傳遞和返回游標變數。

如果子程式開啟或給游標變數賦值,則引數需要為IN OUT型別;如果子程式只是獲取資料,或關閉游標變數,則引數可以為IN IN OUT型別。

形參和實參游標變數型別必須具有相容的返回型別,否則引起ROWTYPE_MISMATCH異常。

如果需要在不同的PL/SQL單元的子程式間傳遞游標變數引數,在包中定義引用游標型別的變數,當型別在包中,則多個子程式可以使用它。

--建立包

CREATE OR REPLACE PACKAGE emp_data AS

    TYPE empcurtyp IS REF CURSOR RETURN employees%ROWTYPE;

    PROCEDURE open_emp_cv (emp_cv IN OUT empcurtyp);

END emp_data;

/

CREATE OR REPLACE PACKAGE BODY emp_data AS

    PROCEDURE open_emp_cv (emp_cv IN OUT EmpCurTyp) IS

    BEGIN

        --開啟游標

        OPEN emp_cv FOR SELECT * FROM employees;

    END open_emp_cv;

END emp_data;

 

--為選擇的語句開啟游標變數(具有相同的返回型別)

CREATE OR REPLACE PACKAGE emp_data AS

    TYPE empcurtyp IS REF CURSOR RETURN employees%ROWTYPE;

    PROCEDURE open_emp_cv (emp_cv IN OUT empcurtyp, choice INT);

END emp_data;

/

CREATE OR REPLACE PACKAGE BODY emp_data AS

    PROCEDURE open_emp_cv (emp_cv IN OUT empcurtyp, choice INT) IS

    BEGIN

        IF choice = 1 THEN

            OPEN emp_cv FOR SELECT * FROM employees

                WHERE commission_pct IS NOT NULL;

        ELSIF choice = 2 THEN

            OPEN emp_cv FOR SELECT * FROM employees

                WHERE salary > 2500;

        ELSIF choice = 3 THEN

            OPEN emp_cv FOR SELECT * FROM employees

                WHERE department_id = 100;

        END IF;

    END;

END emp_data;

 

--為選擇的查詢開啟游標(具有不同的返回型別)

CREATE OR REPLACE PACKAGE admin_data AS

    TYPE gencurtyp IS REF CURSOR; --弱型別

    PROCEDURE open_cv (generic_cv IN OUT gencurtyp, choice INT);

END admin_data;

/

CREATE OR REPLACE PACKAGE BODY admin_data AS

    PROCEDURE open_cv (generic_cv IN OUT gencurtyp, choice INT) IS

    BEGIN

        IF choice = 1 THEN

            OPEN generic_cv FOR SELECT * FROM employees;

        ELSIF choice = 2 THEN

            OPEN generic_cv FOR SELECT * FROM departments;

        ELSIF choice = 3 THEN

            OPEN generic_cv FOR SELECT * FROM jobs;

        END IF;

    END;

END admin_data;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17013648/viewspace-1122772/,如需轉載,請註明出處,否則將追究法律責任。

相關文章