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

本文介绍如何在PL/SQL子程序中使用光标变量作为参数传递查询结果集,包括在不同子程序间传递光标变量的方法及注意事项。演示了如何通过创建包来定义光标类型,并展示了根据不同条件打开不同查询的示例。

光标变量作为子程序参数

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

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

在多语言应用中,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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/17013648/viewspace-1122772/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值