【问题标题】:Return multiple values from PL/SQL Function从 PL/SQL 函数返回多个值
【发布时间】: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 我最终发现我不必以任何方式返回两个值。

标签: oracle plsql sql-function


【解决方案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

    【讨论】:

      猜你喜欢
      • 2013-05-06
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 2015-02-21
      相关资源
      最近更新 更多