从 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;
目前还不确定该怎么做。
如何同时返回 RES
和 RESERVED_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 函数并按名称注册返回值?
如何使用 pl/SQL 函数在 LOV 项中列出数字(例如从 1 到 20)?返回值与显示值相同