ORACLE从函数返回而不创建新类型

时间:2011-12-18 22:59:20

标签: oracle function types oracle11g return

我想创建一个函数(oracle 11g),它将返回多个值,但不必创建新的TYPE。最终目标比我提供的示例复杂得多,但除了获取要返回的值之外,我几乎可以做其他所有事情。

这是我遇到问题的一个非常简化的版本。

例如给出下表(员工):

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;

我需要更改我的退货类型,还是未正确申报? 我并不是完全反对在数据库中创建一个新类型,它只是我们已经走得很远而没有必须创建一个新类型,而且我可以做的事情越少越复杂。如果有办法绕过它,我宁愿学习这种方式并做出更好的决定。

如果我需要提供更多信息,请与我们联系。

1 个答案:

答案 0 :(得分:2)

有许多预定义的集合可能很有用。例如,我通常使用sys.odciVarchar2List,VARRAY(32767)OF VARCHAR2(4000)。但通常只针对特殊代码。对于生产代码,您可能最好创建自己的类型。如果有人决定撤销对标准对象的访问权限,它会使事情变得更加清晰,并且不太可能导致问题。

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