2009-05-15 7 views
1

アプリケーションがOracleストアド・プロシージャからoracle .netプロバイダに情報を渡す標準的な方法は、out refカーソル・パラメータを使用する方法です。過去にはOracle - ストアドプロシージャのOUT参照カーソルパラメータを持つ方法?

パッケージにあった私たちのストアドプロシージャのすべてとこのようなものだった:今、私は、パッケージの外に、通常の手順ではなく、ドンにそのGET_INFO手順を移動したい

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; 
/

をrefcurタイプを得るために何をすべきかを知っていません。パッケージスコープ外ではどうすれば作成できますか?

refcur IS REF CURSORを作成または置換します。

は機能しません。

答えて

8

私はここ(なしオラクル)それをテストすることはできませんが、あなたが行うことができます:

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を宣言するために必要とされる高いことREF CURSOR

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

0
TYPE result_crsr IS REF CURSOR; 

参照カーソルを使用して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; 
+0

? := crsr_test_result行は、Java JDBCアプリケーションがこのsqlのブロックを呼び出して参照カーソルを取得しているためです。私のショートハンドのテクニックは、ストアドプロシージャにロジックを置かずにjavaからpl/sqlで何かを達成したいときです。しかし、ストアドプロシージャと同じように簡単に使用できます。 –

+0

タイプを作成するスコープの外にあるrefcur型のパラメータがある必要があるので、それは考えられません。 –

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が例外を戻していることを意味します。オラクルが返すエラーメッセージは何ですか? ORA-nnnnnで始まり、テキストが続きます。

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

+0

Q1:エラー行1、列23、終了行1、終了列25、見つかった 'REF'、Expecting :ARRAY OBJECT OPAQUE TABLE VARRAY VARYING Q2 - このアプリケーションで使用されるストアドプロシージャはごくわずかです。新しいオラクルユーザーに移動されるすべてのストアドプロシージャは、パッケージが関与する必要はないようです –

関連する問題