我有一个函数返回一个有3个值的对象。有没有办法从select语句调用该函数并使每个值成为不同的列?我可以把它分成3个函数,但是这些值是相关的,所以我想把它作为性能原因保留。 (因此oracle不必为查询中的每一行调用3个非常相似的复杂函数。)
所以:
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;
我希望能够从select语句调用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中做这样的事情,还是有更好的方法来解决这个问题?
答案 0 :(得分:10)
问题中的select语句将起作用。它失败了,因为我没有为内联视图添加别名。
出于某种原因,这将起作用:
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)
答案 1 :(得分:2)
表别名将结果放入命名的结果集上下文中,这使结果可以作为对象实例。如果没有别名,它就会失败,因为如果没有自己的显式引用,转换就不会处理对象类型实例,这实际上就是表别名。