新しい型を作成せずに関数からORACLEを戻す

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

ここで私が問題を抱えているものの非常に単純化されたバージョンです。

たとえば、次の表(従業員)を指定します。

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

次のステートメント従業員のCHILD_FNを選択するが必要です。

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;

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

より多くの情報を提供する必要があるかどうかを教えてください。

3

1 答え

有用な多くの事前定義されたコレクションがあります。たとえば、私は通常、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);
2
追加された