2011-12-18 15 views
3

新しいTYPEを作成せずに複数の値を返す関数(oracle 11g)を作成したいと思います。最終的な目標は私が提供している例よりはるかに複雑ですが、戻り値を得ることを除いて、他のすべてをほとんど行うことができます。新しいタイプを作成せずにORACLE関数を返す

ここでは、私が問題を抱えているものの非常に単純化されたバージョンです。次の表(従業員)与えられた例えば

emplid | emplname | emplchildren 
478 |SAM  |"GEORGE,RON" 
479 |JOSE  |"RICHARD,JANE,RACHEL" 
480 |PAM  |"JORDAN" 

私は返すために、次の文select CHILD_FN from employeesをしたいと思います:

GEORGE 
RON 
RIRCHARD 
JANE 
RACHEL 
JORDAN 

これは私が悩みを抱えている部分を示すために簡略化されて ここにサンプルコードを示します:

create or replace function CHILD_FN RETURN employee.emplname%TYPE IS 
    chldnames employee.emplname%TYPE; 

CURSOR child_cur 
IS 
Select emplchildren FROM employees; 


    begin 

     /*do complicated parsing to separate each delimited 
     value of child_cur and assign 
     it to a new row in the names_col variable/ 

     /*how do I add values to the names_col variable? I've tried 
     'chldnames.extend', 
     various types of 'bulk collect into chldnames' 
     and they all give various errors*/ 


     return chldnames; 

end LOCAL_TEST_FN; 

戻り値の型を変更する必要がありますか、または正しく宣言されていませんか?
私は完全に新しいタイプのデータベースを作成しているわけではありません。新しいタイプを作成する必要がなくても、私はもっと複雑なものを作ることができます。その周りに道があるなら、私はその道を学び、どちらが良いのかを判断することを好むでしょう。

詳細をお知らせください。

答えて

2

有用な事前定義済みのコレクションが多数あります。たとえば、私は通常、VARRAY(32767)OF VARCHAR2(4000)のsys.odciVarchar2Listを使用します。しかし、通常はアドホックコードの場合のみです。プロダクションコードの場合は、独自の型を作成する方がよいでしょう。これは、物事をより明確にし、誰かが標準オブジェクトへのアクセスを取り消すことを決定した場合、問題を引き起こす可能性は低い。

create or replace function child_fn return sys.odcivarchar2list is 
    childnames sys.odcivarchar2list := sys.odcivarchar2list(); 
begin 
    --Add elements 
    childnames.extend; 
    childnames(childnames.last) := 'GEORGE'; 
    childnames.extend; 
    childnames(childnames.last) := 'RON'; 
    --... 

    --Also could use something like this: 
    --childnames := sys.odciVarchar2List('GEORGE','RON','RIRCHARD','JANE'); 

    return childnames; 
end; 
/

--For SQL it's often more convenient to use it like a table: 
select column_value from table(child_fn); 
関連する問題