Oracle:将函数结果拆分为多个列

时间:2018-04-11 09:28:48

标签: oracle plsql

我在oracle中有一个包。在包中我有一个执行(插入到...选择..)语句

的过程

是这样的:

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

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

来自some_other_table

my_func(col3)执行某些逻辑以返回值。

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

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

我无法与历史记录表进行联接,因为该功能不会执行简单的选择。

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

1 个答案:

答案 0 :(得分:3)

创建一个包含两个属性的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 |