ORACLE возврат из функции без создания нового типа - PullRequest
3 голосов
/ 19 декабря 2011

Я хочу создать функцию (оракул 11g), которая будет возвращать несколько значений, но без необходимости создания нового ТИПА.Конечная цель намного сложнее, чем пример, который я привожу, но я могу сделать почти все остальное, кроме получения возвращаемых значений.

Вот очень упрощенная версия того, с чем у меня возникают проблемы.

например, учитывая следующую таблицу (сотрудники):

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 Ответ

2 голосов
/ 19 декабря 2011

Есть много предопределенных коллекций, которые могут быть полезны. Например, я обычно использую 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);
...