2011-12-18 23 views
3

我想創建一個函數(Oracle 11g),它將返回多個值,但不必創建新的TYPE。最終目標比我提供的示例複雜得多,但除了獲取值返回之外,我幾乎可以做其他任何事情。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

有許多預先定義的集合可能有用。例如,我通常使用sys.odciVarchar2List,VARRAY(32767)OF VARCHAR2(4000)。但通常只適用於adhoc代碼。對於生產代碼,您可能更適合創建自己的類型。如果有人決定撤銷對標準對象的訪問,它會使事情更加清晰,並且不太可能導致問題。

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