2009-06-30 7 views
3

レコードのout変数を持つoracle 11gサーバーにストアドプロシージャがあります。この手順は編集できません。プロシージャを呼び出してレコードセット内の情報を返す関数を作成しています。 past questionレコード収集タイプからデータを選択

私の質問は、レコードのテーブルの種類を作成し、SQLで直接クエリできますか?または、レコードをオブジェクト型に変換し、それを直接照会するためのテーブル型を作成する必要がありますか?

+0

どのRDMSを使用していますか?ストアドプロシージャの内部でできることは、プラットフォームによって異なります。 –

+0

申し訳ありませんが、oracleを使用しています11g – Slowbie

答えて

1

あなたのリンク先の質問にはOracleというタグが付いているので、私はあなたが使っていると仮定しています。

最も簡単な方法は、おそらくCURSORを返して:

 
SQL> VAR cr_dual REFCURSOR 

SQL> BEGIN 
    2   OPEN :cr_dual FOR 
    3   SELECT 1 
    4   FROM dual 
    5   UNION ALL 
    6   SELECT 2 
    7   FROM dual; 
    8 END; 
    9/

Процедура PL/SQL успешно завершена. 

SQL> PRINT cr_dual 

     1 
---------- 
     1 
     2 
0

あなたが1つのレコードだけを受信して​​いて、レコード定義を知っていれば、あなたが直接名前でレコードのフィールドにできるはずです。例えば

TYPE myrecord IS RECORD (
     itemA NUMBER, 
     itemB myTable.columnName%TYPE 
); 

あなたがmyrecordタイプの記録を持っているとき、あなたはこのような方法でitemAを参照することができます。あなたがこの問題を回避することができるかもしれ

CREATE OR REPLACE FUNCTION myFunction(theRecord IN myrecord%TYPE) RETURN NUMBER 
IS 
BEGIN  
    RETURN recordInstance.itemA; 
END myFunction; 

ノートあなたの呼び出しコードでは、元のプロシージャが返すレコードタイプを単に扱うだけです。

+0

レコードの一部のみが必要な場合はうまくいくはずですが、レコードの複数の部分が必要です。このプロシージャは、複数の変数を含むように、郵送先住所のレコードを戻します。市、郵便番号、番地、番地、番地、接尾辞。その他いくつか。私はテーブルにレコードをキャストすることを望んでいたので、アドレス指定を使用する40のアプリケーションのコードを変更する代わりに、SQLステートメントでレコードを選択することができました。 – Slowbie

+0

@スロービー、そうです。いくつのフィールドを返すことを望んでいますか、またはアドレスのconcatinated varcharが必要ですか?私はそれがあなたの関数からの戻り値としてあなたが欲しいものを見て良いだろうと思う。 – akf

0

VARRAYを試すことができます。

まず -

create or replace type addr_type 
as object 
(name varchar2(20) 
,city varchar2(20) 
) 

そして今、あなたはvarr_addrで仕事を返すことができ

create or replace type varr_addr as varray(10) of addr_type 
/

としてあなたの可変長配列を作成します。例:

SQL> create or replace procedure ret_user_addr (p_out out varr_addr) 
    2 is 
    3 begin 
    4 p_out := varr_addr(addr_type('NAME1','CITY1'),addr_type('NAME2','CITY2')); 
    5 end; 
    6/

Procedure created. 

SQL> sho err 
No errors. 

今、あなたはあなたが行うように、あなたがテーブル(VARIABLE_NAME)から選択することができますcall.Andどこから正しく設定されて変数を持っている必要があります。

3

RECORDはPL/SQLの概念です。したがって、RECORDに基づいてTABLE TYPEを作成し、そのTYPEをSQL文で使用することはできません。 SQLは、SQLで作成されたTYPEのみを認識します。

シナリオを正しく理解していれば、SQLでオブジェクトやネストした表を作成する必要があります。その後、関数はプロシージャーを呼び出し、レコードをネストした表に変換することができます。次に、ネストしたテーブルを返すか、パイプライン処理することができます。

1

この問題の原因は、ストアドプロシージャのロジックに基づいてビューを作成し、そのビューから直接クエリを作成することでした。

関連する問題