Пользовательский тип, охватывающий столько столбцов, сколько он имеет полей в выражении DML - PullRequest
0 голосов
/ 05 августа 2011

Скажем, у меня есть собственный тип данных, который имеет несколько членов.Например:

create type myType as object(
  field1  number,
  field2  varchar2(50),
  field3  varchar2(25)
);

Теперь, если у меня есть функция, которая возвращает myType и помещает ее, скажем, в оператор select, Oracle вернет что-то вроде:

select myTypeFunction() from dual;

> myTypeFunction()
> -------------------------------------------------
> schemaowner.myType(1,'something','another thing')

Есть ли общий способ, которым я могу разделить эти три (в этом примере) поля на их собственные столбцы;поэтому в этом случае я хотел бы вернуть:

> field1  field2     field3
> --------------------------------
>      1  something  another thing

Я знаю, что это возможно, вызывая функцию несколько раз.Например:

select myTypeFunction().field1,
       myTypeFunction().field2,
       myTypeFunction().field3
from   dual;

Или, вызвав функцию один раз в подзапросе (или, аналогично, используя тип таблицы):

select x.y.field1, x.y.field2, x.y.field3
from   (select myTypeFunction() y from dual) x;

-- or, where myTypeFunction has been modified to return a table of myType:

select field1,field2,field3 from table(myTypeFunction());

Однако все эти способы кажутся грязными инеэффективный - последний вариант, возможно, выглядит наиболее привлекательным, за исключением альтернатив - поэтому я бы предпочел избегать их, если это возможно.Более того, я считаю, что ни один из этих способов не сработал бы, если бы у функции были параметры, которым были переданы значения из других источников;например:

select x.field1, x.field2, x.field3
from   lookupTable alpha,
       table(anotherTypeFunction(alpha.id)) x;

или более сложное соединение, где anotherTypeFunction, очевидно, возвращает различные значения, основанные на его параметрах.(Хотя я не очень уверен в этом!)

Спасибо:)

1 Ответ

0 голосов
/ 05 августа 2011

Я не уверен, что вы ищете, так как вы очень много перечисляете альтернативы, а затем отказываетесь использовать любую из них без веских аргументов.Я не думаю, что какой-либо из них является грязным (вопрос личного мнения) или неэффективным (у меня нет профилирования, чтобы доказать это либо).

Не должно быть никаких проблем для передачи параметров в myTypeFunction и anotherTypeFunction в ваших примерах.

Этот пример даст вам вывод, который вы запрашивали.myTypeToTable не зависит от членов myType.

create or replace type myType as object(
  field1 number,
  field2 varchar2(20),
  field3 varchar2(20)
);
/

create or replace type myTypeList as table of myType;
/

create or replace function myTypeToTable(obj in myType)
return myTypeList pipelined as
begin
  pipe row(obj);
  return;
end;
/

select * from table(myTypeToTable(myType(34, 'foo', 'and more foo')));

    FIELD1 FIELD2               FIELD3
---------- -------------------- --------------------
    34     foo                  and more foo

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...