光标变量作为子程序参数
光标变量可以作为子程序参数用于在子程序之间传递查询结果集:
可以在一个子程序中打开光标变量,在其它的子程序中处理它。
在多语言应用中,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/
本文介绍如何在PL/SQL子程序中使用光标变量作为参数传递查询结果集,包括在不同子程序间传递光标变量的方法及注意事项。演示了如何通过创建包来定义光标类型,并展示了根据不同条件打开不同查询的示例。
177

被折叠的 条评论
为什么被折叠?



