1

アプリケーションがOracleストアドプロシージャからOracle.netプロバイダーに情報を渡す標準的な方法は、outrefカーソルパラメータを使用することです。

以前は、すべてのストアドプロシージャがパッケージに含まれており、次のようなものがありました。

CREATE OR REPLACE PACKAGE test_package IS
   TYPE refcur IS REF CURSOR;
   PROCEDURE get_info ( o_cursor            OUT      refcur );
END test_package;
/
CREATE OR REPLACE PACKAGE BODY test_package IS
   PROCEDURE get_info ( o_cursor            OUT      refcur ) AS
   BEGIN
     OPEN o_cursor FOR
       SELECT * FROM v$database;
   END get_info;
END test_package;
/

ここで、そのget_infoプロシージャをパッケージから通常のプロシージャに移動したいのですが、refcurタイプを取得するために何をすべきかわかりません。パッケージスコープ外で作成するにはどうすればよいですか?

CREATE OR REPLACE TYPE refcur is REF CURSOR;

動作しません。

4

3 に答える 3

8

ここでテストすることはできません(Oracleなし)が、次のことができます:

create or replace procedure get_info(p_cursor out sys_refcursor)
is
begin
  open p_cursor for
    select *
    from   v$database; 
end;
/

Oracle 9 以降では、 TYPE result_crsr IS REF CURSORを宣言する必要がなくなりました。

代わりにsys_refcursorを使用してください。

于 2009-05-15T16:45:04.060 に答える
0

これを試して:

CREATE OR REPLACE PROCEDURE get_info(o_cursor OUT sys_refcursor) IS
BEGIN
  OPEN o_cursor FOR SELECT * FROM dual;
END;
/

あなたの質問は2つの重要な質問を提起しました:

1)あなたはそれが「機能しない」と言います。これは、ステートメントを実行したときにOracleが例外を返すことを意味します。Oracleが返すエラーメッセージは何ですか?ORA-nnnnnで始まり、その後にテキストが続く必要があります。

2)PROCEDUREをパッケージから移動することでどのような目的が果たされますか?パッケージにはさらに数行のコードがあり、プロシージャの署名はパッケージの仕様とパッケージの本体の両方で繰り返されますが、パッケージ内にプロシージャがあると、いくつかの重要な利点があります。

于 2009-05-15T14:45:18.623 に答える
0
TYPE result_crsr IS REF CURSOR;

ref カーソルを使用した SQL の無名ブロックの例:

DECLARE
   TYPE result_crsr IS REF CURSOR;
   crsr_test_result   result_crsr;
BEGIN


   OPEN crsr_test_result FOR
        SELECT * from user_objects;
     ? := crsr_test_result;
END;
于 2009-05-15T14:37:48.970 に答える