我有一个函数返回一个具有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中是否可以执行类似的操作,或者是否有更好的方法来解决此问题?

最佳答案

问题中的select语句将起作用。失败是因为我没有为内联 View 添加别名。

由于某些原因,它将起作用:

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)

关于sql - 在Oracle中的select语句中使用对象类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1589715/

10-09 19:05