2011-07-17 6 views
2

これまでのところほとんどSQL Serverで作業していましたが、今は新しいプロジェクトのためにOracleに移行しています。パッケージはOracleデータベースからのデータを返す唯一の方法ですか?

データを.netアプリケーションに返すprocを作成しようとしています。

CREATE OR REPLACE PACKAGE GetAllDepartments AS 
TYPE T_CURSOR IS REF CURSOR; 
PROCEDURE p_GetAllDepartments 
(
    cur_Result OUT T_CURSOR 
); 
END GetAllDepartments; 

CREATE OR REPLACE PACKAGE BODY GetAllDepartments AS 
PROCEDURE p_GetAllDepartments 
(
    cur_Result OUT T_CURSOR 
) 
IS 
BEGIN 
    OPEN cur_Result FOR 
    SELECT * FROM DEPARTMENTS; 

END p_GetAllDepartments; 
END GetAllDepartments; 

これは、Oracleに行くための唯一の方法です?私はちょうどPROCを作成し、それが直接呼び出すことはできません:私はこれが動作するようになった唯一の方法は、次のようにパッケージを使用しているのですか?ありがとう

+0

パッケージを持たないストアドプロシージャだけを持ち、.NETアプリケーションから呼び出すことは間違いありません。このような手順を実行しようとしたとき、または結果が返されないときに実行を中止しますか? – alwayslearning

答えて

4

は、Oracleのサポートされるバージョンを持っていると仮定すると、あなたは、関連するものを行う手順を収集するために、パッケージを使用して、組織の観点から、オフ通常は優れている、と述べた

CREATE OR REPLACE PROCEDURE get_all_departments(p_result OUT SYS_REFCURSOR) 
AS 
BEGIN 
    OPEN p_result 
    FOR SELECT * 
     FROM departments; 
END get_all_departments; 

ような何かを行うことができるはずです。あなたのケースでは、たとえば、部門を扱うすべての手順(つまり、create_departmentdelete_departmentなど)を持つパッケージを用意することは、一般に意味があります。

一般的な文脈の観点からは、ストアド・プロシージャに入れるロジックを実装し、問合せだけのストアド・プロシージャを作成するのではなく、そのビューを問い合せるビューを作成する方がOracleで一般的です。

+0

SYS_REFCURSORデータ型が欠けていたのですが、REFCURSORがこのような場合になぜ機能しないのか知っていますか?このプロシージャを呼び出すときにrefcursor paramを使うことができます。 – Pablote

+0

@Pablote - 「REFCURSORは動作しません」という意味ですか?弱く型付けされたREF CURSORを定義したパッケージを作成し、その弱い型付けされたREF CURSORを出力パラメータとして使用するスタンドアロン・プロシージャを作成できます。プロシージャ内に弱い型付けされたREF CURSORを定義してから、それをOUTパラメータとして使用することはできません。弱い型付けされたカーソルの宣言はOUTパラメータの宣言の前にあり、手順。パッケージを使用するだけで、プロシージャの前にカーソルを宣言することができます。 –

+0

私はこのコードであなたの応答でprocを呼び出すことができます:[変数mycur REFCURSOR; exec get_all_departments(:mycur); print mycur;] ...しかし、私はproc宣言で同じREFCURSORを使用することはできません。私はあなたのおかげでSYS_REFCURSORを見つけました。型宣言について言うと、procsのためのパッケージがOUTカーソルパラム、ありがとう – Pablote

1

これは、パッケージなしで行うことができます。結果セットを返す関数を作成します。

これらの関数は、テーブル、例えば同じように使用することができます:SELECT * FROM my_function()

結果は、サーバー上でバッファリングされますが、クライアントに行毎に送信されないので、これは、パイプライン機能を備えた、特に効率的である:

http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_packages.htm#i1008519

しかし基本的な手法は同じです。つまり、関数の戻り値の型に使用される型を定義する必要があります。 PostgreSQLやSQL Serverのような "匿名の"結果セットを返すことはできません。

関連する問題