从 Oracle 12c 函数返回多个值

Posted

技术标签:

【中文标题】从 Oracle 12c 函数返回多个值【英文标题】:Returning multiple values from an Oracle 12c function 【发布时间】:2014-11-07 23:47:30 【问题描述】:

我正在 Oracle 12c 中编写一个函数(它必须是一个函数),它应该返回 3 个值,order_line.o_id,我在函数中创建的变量 total,以及我在函数中创建的 discounted_amount 变量在函数中创建。

我已经获得了创建 discounted_amount 变量并返回它的函数,但我不确定如何让它返回这两个值。

CREATE OR replace FUNCTION DiscountsReport (input_o_id IN REAL) 
RETURN REAL 
IS 
  output_o_id      NUMBER; 
  total            REAL; 
  discounted_total REAL; 
  percent          REAL; 
BEGIN 
    output_o_id := input_o_id; 

    SELECT SUM(o.ol_quantity * o.ol_price) 
    INTO   total 
    FROM   order_line o 
    WHERE  o.o_id = input_o_id; 

    IF total > 100 THEN 
      percent := 0.1; 
    ELSIF total > 200 THEN 
      percent := 0.2; 
    ELSE 
      percent := 0.0; 
    END IF; 

    discounted_total := ( total * ( 1 - percent ) ); 

    RETURN discounted_total; 
END; 

【问题讨论】:

一个函数只能返回一个东西。您可以创建一个包含三列的对象(或记录类型)并返回该对象或记录的实例。或者您可以将函数声明为具有多个 OUT 参数,但这在架构上似乎是一个糟糕的选择。 【参考方案1】:

创建一个新类型:

CREATE OR REPLACE TYPE new_type AS OBJECT(v1 type1, v2 type2, v3 type3);

并在RETURN 之后使用它(调用结果output - 它的类型是new_type)。

您可以使用以下方式访问这些值:

output.v1
output.v2
output.v3

【讨论】:

当我尝试使用您提到的 create of replace 语句(使用正确的类型而不是 type1 除外)我收到错误“错误(5,1):PLS-00103:遇到符号“创建" " 在该行之后/之前添加/,看看会发生什么......(在新行上) 啊……真尴尬。是的,就是这样,哈哈。然后如何创建该类型的实例以在运行时从函数中获取输出 类似这样的东西:RETURN new_type,在ISoutput new_type,在BEGIN和END之间:output.v1/2/3 := x1/2/3 RETURN output 好的,很酷。我正在测试函数,但我不知道如何打印 new_type 的实例。有什么特别的方法可以做到吗?

以上是关于从 Oracle 12c 函数返回多个值的主要内容,如果未能解决你的问题,请参考以下文章

从oracle中的函数返回多个值

Oracle 12C:插入值后返回记录

plsql 使用 dbms_sql 12c 选择返回值

如何从 Oracle 存储过程中获取两个返回值

Oracle 过程或函数返回多个值

如何运行返回多个值的Oracle函数