从 PL/SQL 函数返回多个值

Posted

技术标签:

【中文标题】从 PL/SQL 函数返回多个值【英文标题】:Return multiple values from PL/SQL Function 【发布时间】:2014-06-20 06:50:15 【问题描述】:

我需要尝试在飞机上找到一个空闲座位,然后预订那个座位。

我需要返回一个表示成功与否的值以及一个座位号。通过环顾四周,我发现函数返回的值不能超过 1,所以我考虑使用数组,但查看那些文档很明显,我在 PL/SQL 方面还不够好,无法理解如何使用它们.

所以我在这里,搁浅了。

目前我得到的代码如下所示:

CREATE OR REPLACE FUNCTION RESERVE_SEAT(P_NO VARCHAR2, ID NUMBER, RESERVE_TIME NUMBER, S_NO VARCHAR2)
RETURN INTEGER AS
  RES INTEGER := 0;
  COUNTS INTEGER := 0;
BEGIN
SELECT COUNT(*) INTO COUNTS FROM SEAT WHERE SEAT_NO=S_NO AND PLANE_NO=P_NO;
IF(COUNTS = 1) THEN
  UPDATE SEAT
  SET RESERVED = ID, BOOKING_TIME = RESERVE_TIME, BOOKED=ID
  WHERE PLANE_NO=P_NO AND SEAT_NO=S_NO;
  COMMIT;
    ELSE IF(COUNTS = 0) THEN
      RES := -1;
    END IF;
  END IF;
  RETURN RES;
END RESERVE_SEAT;

上面的这个函数被下面的函数调用

CREATE OR REPLACE FUNCTION GET_FREE_SEAT(P_NO VARCHAR2, ID NUMBER, RESERVE_TIME NUMBER)
RETURN INTEGER AS
  RESERVED_SEAT_NO VARCHAR2(100) := 'NULL';
  RES INTEGER := 0; -- Assume Success Scenario from the Get-go
BEGIN
  SELECT SEAT_NO INTO RESERVED_SEAT_NO
  FROM SEAT
  WHERE RESERVED IS NULL AND BOOKED IS NULL AND ROWNUM = 1
  OR BOOKED IS NULL AND ((RESERVE_TIME - 5000) <= BOOKING_TIME) AND ROWNUM = 1;

  IF(RESERVED_SEAT_NO != 'NULL') THEN
    RES := RESERVE_SEAT(P_NO,ID,RESERVE_TIME,RESERVEd_SEAT_NO);
  END IF;
  RETURN RES;
END GET_FREE_SEAT;

目前还不确定该怎么做。

如何同时返回 RESRESERVED_SEAT_NO

【问题讨论】:

必须是函数吗?您可以有一个带有两个 OUT 参数的过程。有一种观点认为,一个函数不应该改变任何数据,就像你在这里所做的那样,而应该只检索它;这在任何地方都没有强制执行,只是惯例,但它通常被认为是最佳实践。 (Oracle hint at it:“通常,您使用过程来执行操作,使用函数来计算和返回值”)。 @AlexPoole 我最终发现我不必以任何方式返回两个值。 【参考方案1】:

您无法返回 2 个变量。它必须是一个。

您可以使用可以从函数返回的自定义记录类型或数组。

TYPE new_type is record(RES pls_integer, RESERVED_SEAT_NO pls_integer);

CREATE OR REPLACE FUNCTION GET_FREE_SEAT(P_NO VARCHAR2, ID NUMBER, RESERVE_TIME NUMBER)
RETURN new_type AS new_type_variable
BEGIN
  SELECT SEAT_NO 
  INTO new_type_variable.RESERVED_SEAT_NO
  FROM SEAT
  WHERE 
      RESERVED IS NULL 
      AND BOOKED IS NULL 
      AND ROWNUM = 1
      OR BOOKED IS NULL 
      AND (RESERVE_TIME - 5000) <= BOOKING_TIME
      AND ROWNUM = 1;

  IF(RESERVED_SEAT_NO != 'NULL') THEN
    select RESERVE_SEAT(P_NO,ID,RESERVE_TIME,RESERVEd_SEAT_NO) into new_type_variable.res from dual;
  END IF;
  RETURN new_type_variable;
END GET_FREE_SEAT;

【讨论】:

【参考方案2】:

OUT 参数是最好的解决方案或使用 RECORD(如数组)并返回它。

PROCEDURE RETURN_MULTIPLE_VAR(输入 VARCHAR2, OUT_1 OUT Varchar2, --return out1 OUT_2 OUT NUMBER ... --return out2

【讨论】:

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

使用 JDBC 从 PL/SQL 存储函数中获取表返回值

是否可以从 jdbc 调用 pl/sql 函数并按名称注册返回值?

如何使用 pl/SQL 函数在 LOV 项中列出数字(例如从 1 到 20)?返回值与显示值相同

获取 ORA-06503 的原因:PL/SQL:函数返回没有值?

PL/SQL:无法从包元素 PL/SQL 返回值

具有布尔返回值的 pl/sql 函数的 OracleType?