【问题标题】:Oracle: split function result into multiple columnsOracle:将函数结果拆分为多列
【发布时间】:2018-09-21 02:57:04
【问题描述】:

我在 oracle 中有一个包。在包中,我有一个执行(插入..select..)语句的过程

是这样的:

插入 some_table(col1 , col2 , col3, col4)

选择 col1 , col2, my_func(col3) as new_col3 , col4

来自 some_other_table

my_func(col3) 执行一些逻辑来返回一个值。

现在我需要使用相同的逻辑返回两个值而不是一个。

我可以简单地编写另一个函数来执行相同的逻辑并返回第二个值,但这会很昂贵,因为该函数是从一个大的历史表中选择的。

我无法与历史表进行连接,因为该函数不执行简单的选择。

有没有办法通过只调用一次这个函数来获得两列?

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    创建一个具有两个属性的OBJECT 类型并从您的函数中返回它。比如:

    SQL Fiddle

    Oracle 11g R2 架构设置

    CREATE TYPE my_func_type IS OBJECT(
      value1 NUMBER,
      value2 VARCHAR2(4000)
    );
    /
    
    CREATE FUNCTION my_func
    RETURN my_func_type
    IS
      value my_func_type;
    BEGIN
      value := my_func_type( 42, 'The Meaning of Life, The Universe and Everything' );
      RETURN value;
    END;
    /
    
    CREATE TABLE table1 (col1, col2, col5 ) AS
      SELECT 1, 2, 5 FROM DUAL
    /
    

    查询 1

    SELECT col1,
           col2,
           t.my_func_value.value1 AS col3,
           t.my_func_value.value2 AS col4,
           col5
    FROM   (
      SELECT col1,
             col2,
             my_func() AS my_func_value,
             col5
      FROM   table1
    ) t
    

    Results

    | COL1 | COL2 | COL3 |                                             COL4 | COL5 |
    |------|------|------|--------------------------------------------------|------|
    |    1 |    2 |   42 | The Meaning of Life, The Universe and Everything |    5 |
    

    【讨论】:

    • @Nina - 已更新。在查询中引用对象属性时需要使用表名/别名。
    • 目前,您无法在 PL/SQL 块、子程序或包中定义对象类型。
    • “生命、宇宙和万物的意义”1+
    • @Nina 如果要在 SQL 查询中使用它们(在 Oracle 11g 及更低版本 - Oracle 12.something 支持),您需要在 SQL 范围内定义对象类型(不在 PL/SQL 中) PL/SQL 在 SQL 中声明的类型)。
    • @Nina 为什么您“需要”将对象类型包含在包中?通过在架构级别创建类型(即create or replace object ...),您将一无所获。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多