2012-08-14 32 views
1

我有一個包P和一個過程A在裏面。如何調用plsql程序輸出參數作爲用戶定義的遊標?

create or replace package pkg_get_users_info_by_role 
as 
type user_info_ref_cur is ref cursor; 
procedure get_user_info_proc 
(p_role_name varchar2, p_user_info out user_info_ref_cur); 
end pkg_get_users_info_by_role; 
/

和身體;

create or replace package body pkg_get_users_info_by_role 
as 
procedure get_user_info_proc 
(p_role_name varchar2, p_user_info out user_info_ref_cur) 
as 
begin 
open p_user_info for 
select user_id,username,user_password,role_name from user_info,role_info 
where user_info.user_role=role_info.role_id 
and role_info.role_name like p_role_name; 
end; 
end pkg_get_users_info_by_role; 

我的問題是,我該如何調用過程?我是否需要pkg_get_users_info_by_role.user_info_ref_cur類型的變量來調用它?我無法創建這種類型的變量。有什麼辦法可以解決這個問題嗎?

謝謝!

回答

3

是的,你只需在你的調用程序中定義光標作爲package.type。這是一個簡單的插圖,應該適用於大多數任何Oracle數據庫:

CREATE OR REPLACE PACKAGE pkg AS 
TYPE rc IS REF CURSOR; 
PROCEDURE get_rc(p_rc OUT rc); 
END pkg; 
/
CREATE OR REPLACE PACKAGE BODY pkg AS 
PROCEDURE get_rc(p_rc OUT rc) IS 
BEGIN 
    OPEN p_rc FOR 
    SELECT t.owner, t.table_name FROM all_tables t; 
END get_rc; 
END pkg; 
/

DECLARE 
    crsr pkg.rc; 
    v1 VARCHAR2(32); 
    v2 VARCHAR2(32); 
BEGIN 
    pkg.get_rc(crsr); 
    LOOP 
    EXIT WHEN crsr%NOTFOUND; 
    FETCH crsr INTO v1, v2; 
    dbms_output.put_line(v1||': '||v2); 
    END LOOP; 
    CLOSE crsr; 
END; 
/
+0

它的工作!謝謝 !! – user1596826 2012-08-15 00:24:09

相關問題