我在oracle中有一个包。在包中我有一个执行(插入到...选择..)语句
的过程是这样的:
插入some_table(col1,col2,col3,col4)
选择col1,col2,my_func(col3)为new_col3,col4
来自some_other_table
my_func(col3)执行某些逻辑以返回值。
现在我需要使用相同的逻辑返回两个值而不是一个。
我可以简单地编写另一个函数来执行相同的逻辑并返回第二个值,但这样会很昂贵,因为该函数从大型历史表中进行选择。
我无法与历史记录表进行联接,因为该功能不会执行简单的选择。
有没有办法通过只调用一次这个函数来获得两列?
答案 0 :(得分:3)
创建一个包含两个属性的OBJECT
类型,并从您的函数返回该类型。类似的东西:
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 |