1

パッケージPと手順Aが含まれています。

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タイプの変数が必要ですか?このタイプの変数を作成できません。これを解決する方法はありますか?

ありがとう!!

4

1 に答える 1

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;
/
于 2012-08-14T18:03:53.880 に答える