在 Oracle 的 select 语句中使用对象类型

Posted

技术标签:

【中文标题】在 Oracle 的 select 语句中使用对象类型【英文标题】:Using an object type in a select statement in Oracle 【发布时间】:2009-10-19 16:27:45 【问题描述】:

我有一个函数,它返回一个具有 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 中做这样的事情,或者有没有更好的方法来解决这个问题?

【问题讨论】:

【参考方案1】:

问题中的 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)

【讨论】:

问题只是名称解析。 Oracle 总是将 SELECT 语句中点之前的第一部分解释为数据库中的表别名或同义词/包。它也不会检查所有列。所以你必须用 table_alias.column.attribute 完全限定名称【参考方案2】:

表别名将结果放入命名的结果集上下文中,从而使结果能够作为对象实例工作。没有别名,它会失败,因为转换不会处理没有自己显式引用的对象类型实例,这实际上就是表别名。

【讨论】:

以上是关于在 Oracle 的 select 语句中使用对象类型的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中insert into select和select into的区别

如何存储 select 语句的结果并能够在另一个 select 语句中再次使用它 PL\SQL Oracle

oracle如何在CASE WHEN ELSE语句中使用select语句?

在 select 语句中使用连接的 Oracle 更新

Oracle Select语句

Oracle Select语句