2009-10-19 1 views
8

У меня есть функция, которая возвращает объект, который имеет 3 значения. Есть ли способ вызвать эту функцию из оператора select и иметь ли каждое значение другой столбец? Я мог бы разбить его на 3 функции, но значения связаны, поэтому я хотел сохранить его как один из соображений производительности. (Так что оракул не должен вызывать 3 очень похожие сложные функции для каждой строки в запросе.)Использование типа объекта в операторе select в Oracle

Так для:

create type test_obj is object ( 
a NUMBER, 
b NUMBER, 
c NUMBER); 

    create or replace function test_func (
    pinput NUMBER) 
    return test_obj 
    as 
    begin 
    return test_obj(0, 0, 0); 
    end test_func; 

Я хотел бы быть в состоянии назвать test_func от оператора выбора , но имеют a, b и c различные столбцы, не вызывая функцию несколько раз. Я думал, что может быть что-то вроде этого, но он не работает:

select 
    iv.col1, 
    iv.col2, 
    iv.func_data.a, 
    iv.func_data.b, 
    iv.func_data.c 
from 
    (select 
     mt.col1, 
     mt.col2, 
     test_func(mt.input) as func_data 
    from 
     my_table mt) iv 

Есть ли способ, чтобы сделать что-нибудь подобное в Oracle 10g, или есть лучший способ решить эту проблему?

ответ

9

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

По какой-то причине это будет работать:

select 
    iv.func_data.a, 
    iv.func_data.b, 
    iv.func_data.c 
from 
    (select 
     test_func(mt.input) as func_data 
    from 
     my_table mt) iv 

Но это не будет:

select 
    func_data.a, 
    func_data.b, 
    func_data.c 
from 
    (select 
     test_func(mt.input) as func_data 
    from 
     my_table mt) 
+0

спасибо! это помогло мне. – filiprem

+1

Проблема заключается просто в разрешении имен. Oracle всегда интерпретирует первую часть перед точкой в ​​инструкции SELECT в виде табличного псевдонима или синонима/пакета в базе данных. Он также не проверяет все столбцы. Таким образом, вы должны полностью квалифицировать имя с помощью table_alias.column.attribute – Falco

2

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

Смежные вопросы