从oracle中的函数返回多个值

Posted

技术标签:

【中文标题】从oracle中的函数返回多个值【英文标题】:Returning multiple values from a function in oracle 【发布时间】:2015-06-23 04:33:11 【问题描述】:

我有下表:

T_TYPE_ID T_TYPE     T_TYPE_PRICE T_TYPE_START_DATE   T_TYPE_END_DATE    
   1      student       10.95     01.04.2015 00:00:00 30.06.2015 00:00:00
   2      Concession    5.5       01.04.2015 00:00:00 30.06.2015 00:00:00

我需要: 创建FUNC_get_ t_type_end_date function 此函数应包含以下输入参数:t_type_p 和以下输出参数:t_type_price_pt_type_end_date_p。如果有一条t_type为t_type_p的记录,它应该返回1,否则返回0。此外,如果有一条记录,它应该将最新的t_type_end_date分配给t_type_end_date_p,将t_type_price分配给t_type_price_p。请注意t_type_end_date_p 可以为空;这意味着相关价格当前有效。

我写了以下代码:

CREATE OR REPLACE FUNCTION FUNC_get_t_type_end_date
  ( t_type_p IN VARCHAR2)
RETURN NUMBER
    AS
    cnum NUMBER;

    CURSOR cr1 IS
    SELECT t_type
      FROM ticket_type
      WHERE t_type = t_type_p;

  BEGIN
  OPEN cr1;
    FETCH cr1 INTO cnum;
    IF cr1%NOTFOUND THEN
      cnum := 0;
      END IF;
      CLOSE cr1;

     RETURN cnum;
   END;

我不知道如何从一个函数返回多个值。我正在使用 oracle。

提示:

create or replace FUNCTION FUNC_get_ t_type_end_date (…)
return number 
as   
    -- define a variable to return a number and assign 0 to it
    -- define a cursor to obtain t_type_price, t_type_end_date of the given t_type_p. The t_type_end_date values should be sorted in descending order – to do so the first record will contain either null or the latest of t_type_end_date
BEGIN
  -- open cursor
  -- fetch the first record from the cursor to t_type_price_p and t_type_end_date_p
  -- if (having a record) then …  
  -- close cursor
  RETURN …
END;

【问题讨论】:

可能是你可以使用带有out参数的过程来代替函数 讨厌你在那里做的那个名字前缀的事情。每个人最终都必须输入很多额外的字符。 另外,显式游标方法很慢,更难编写,更难维护,因此更容易出错。 【参考方案1】:

函数不能返回多个变量。但是,可以返回包含多个值的自定义变量(即记录)类型。为此,您首先需要定义包含您要返回的三个变量的类型,如下所示:

TYPE new_type is record(cnum number, t_type_end_date_p timestamp, t_type_price_p  timestamp);

然后你可以在你的函数中使用它,如下所示:

CREATE OR REPLACE FUNCTION FUNC_get_t_type_end_date  ( t_type_p IN VARCHAR2)
RETURN new_type AS 

new_type_variable newtype;

CURSOR cr1 IS
SELECT t_type
  FROM ticket_type
  WHERE t_type = t_type_p;

BEGIN
OPEN cr1;
FETCH cr1 INTO cnum;
IF cr1%NOTFOUND THEN
  SELECT 0, null, null into new_type_variable from dual;
ELSE
  SELECT 1, cr1.t_type_end_date, cr1.t_type_price into new_type_variable from dual;
END IF;
  CLOSE cr1;

 RETURN new_type_variable ;
END;

【讨论】:

我不知道你想做什么。请正确阅读问题。 @user3803989 我想帮助你。我确实正确地阅读了这个问题。如果有什么匹配的,请澄清 @user380989 这是正确的答案。返回记录类型。或者使用 out 参数。【参考方案2】:

试试这个:

create or replace function func_get_t_type_end_date(t_type_p in varchar2, t_type_price_p out number, t_type_end_date_p out date) return number
    as
        cnum NUMBER;

    CURSOR cr1 IS
    SELECT t_type_price,t_type_end_date
    FROM ticket_type t
    WHERE t_type = t_type_p
        and not exists (select 1
                                  from ticket_type t2
                                  where t2.t_type = t.t_type
                                  and t2.t_type_end_date>t.t_type_end_date);

  BEGIN
  OPEN cr1;
    FETCH cr1 INTO t_type_price_p,t_type_end_date_p;
    IF cr1%NOTFOUND THEN
      cnum := 0;
            else
            cnum := 1;
      END IF;
      CLOSE cr1;

     RETURN cnum;   end;

使用示例:

set serveroutput on
declare
v_result number;
v_type_price_p number;
v_type_end_date_p date;
begin
    v_result:=func_get_t_type_end_date(t_type_p=>'student',t_type_price_p=>v_type_price_p,t_type_end_date_p=>v_type_end_date_p);
    dbms_output.put_line('Result: '||v_result);
    dbms_output.put_line('Price: '||v_type_price_p);
    dbms_output.put_line('End date: '||v_type_end_date_p);        
end;
/

【讨论】:

我需要使用光标来检索值。 调用函数应该怎么做?我应该只传递 t_type 还是其他变量? 您必须指定所有参数。请参阅答案中的示例。 当我尝试在执行块中使用 v_type_price_p 打印输出时,它说变量未声明。 查看更新的使用示例。很可能,您在打印时打错了。

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

从 Oracle 函数返回多个值

oracle中的存储过程如何返回查询到的多个值?

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

Oracle 过程或函数返回多个值

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

快速从函数中返回多个值