ITPub博客

首页 > 数据库 > Oracle > PLSQL Language Referenc-PL/SQL静态SQL-光标变量-光标变量作为子程序参数

PLSQL Language Referenc-PL/SQL静态SQL-光标变量-光标变量作为子程序参数

原创 Oracle 作者:LuiseDalian 时间:2014-03-16 19:10:13 0 删除 编辑

光标变量作为子程序参数

光标变量可以作为子程序参数用于在子程序之间传递查询结果集:

可以在一个子程序中打开光标变量,在其它的子程序中处理它。

在多语言应用中,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博客 ” ,链接:https://blog.itpub.net/17013648/viewspace-1122772/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-02-06

  • 博文量
    1986
  • 访问量
    6044090