Тип объекта по столбцам - PullRequest
0 голосов
/ 08 марта 2011

Я знаком с объектами Oracle, вложенными таблицами, функциями table () и т. Д. Но возможно ли создать тип объекта, где у вас есть, например, два столбца varchar2, и выбрать этот тип в качестве столбцов, не создавая вложенный тип таблицы этого типа объекта?

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

Мне нужно это так:

SELECT MY_FUNC(params)
FROM   DUAL

И результат будет:

|field 1| |field 2|
 txt1      txt2

Но результат теперь:

|MY_FUNC(params)|
(txt1; txt2)

Ответы [ 3 ]

3 голосов
/ 08 марта 2011

вы можете использовать объекты Oracle для возврата более одного фрагмента данных. Рассмотрим:

SQL> CREATE OR REPLACE TYPE t AS OBJECT (
  2     x NUMBER,
  3     y NUMBER
  4  );
  5  /

Type created

SQL> SELECT a.obj.x, a.obj.y FROM (SELECT t(0,1) obj FROM DUAL) a;

     OBJ.X      OBJ.Y
---------- ----------
         0          1
2 голосов
/ 08 марта 2011

Я бы, вероятно, сделал бы это с конвейерной табличной функцией , так что это выглядело бы как:

CREATE OR REPLACE PACKAGE test_pkg
AS

    TYPE rec_t IS RECORD(field_1 varchar2(10), field_2 varchar2(10));

    TYPE tbl_t IS TABLE OF rec_t;

    FUNCTION my_func(p1_in IN NUMBER)
    RETURN tbl_t
    PIPELINED;

END test_pkg;
/

CREATE OR REPLACE PACKAGE BODY test_pkg
AS

    FUNCTION my_func(p1_in IN NUMBER)
    RETURN tbl_t
    PIPELINED
    IS
        rec REC_T;
    BEGIN    
        IF p1_in > 10
        THEN
            rec.field_1 := 'one';
            rec.field_2 := 'two';
        ELSE
            rec.field_1 := 'three';
            rec.field_2 := 'four';
        END IF;

        PIPE ROW(rec);      

        RETURN;

    END my_func;

END test_pkg;

Который затем можно запросить как:

select *
from table(test_pkg.my_func(2))

Что возвращает:

FIELD_1 FIELD_2
three     four
0 голосов
/ 08 марта 2011

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

CREATE OR REPLACE TYPE testtype AS OBJECT( x NUMBER, y NUMBER);
/

CREATE OR REPLACE TYPE testtypetab AS TABLE OF testtype;
/

CREATE OR REPLACE FUNCTION testfunc RETURN testtype AS
BEGIN
  RETURN testtype(1,1);
END testfunc;
/

select * from table(cast(multiset(select testfunc from dual) as testtypetab));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...