运行创建的过程时发生Oracle错误

运行创建的过程时发生Oracle错误,oracle,plsql,procedure,Oracle,Plsql,Procedure,我有基于酒店客房住宿的Oracle数据库。 我已经创建了一个手术室,但我无法让它工作 这是我的SQL过程代码: CREATE PROCEDURE Room_taken ( v_guestID IN NUMBER DEFAULT NULL , v_stayfrom IN DATE DEFAULT NULL , v_stayto IN DATE DEFAULT NULL , v_roomID IN NUMBER DEFAULT NULL , v_paymentID IN NUMBER DEFAULT

我有基于酒店客房住宿的Oracle数据库。 我已经创建了一个手术室,但我无法让它工作

这是我的SQL过程代码:

CREATE
PROCEDURE Room_taken
(
v_guestID IN NUMBER DEFAULT NULL ,
v_stayfrom IN DATE DEFAULT NULL ,
v_stayto IN DATE DEFAULT NULL ,
v_roomID IN NUMBER DEFAULT NULL ,
v_paymentID IN NUMBER DEFAULT NULL ,
v_totalprice IN NUMBER DEFAULT NULL 
)
AS
v_nofrom DATE;
v_noto DATE;
v_idroom NUMBER(10,0);

BEGIN

BEGIN
SELECT Stay_from, Stay_to     
INTO v_nofrom, v_noto
FROM Stayover
WHERE ID_room = v_roomID;
IF NOT ( v_nofrom >= v_stayfrom
AND v_noto <= v_stayto ) THEN

BEGIN
INSERT INTO Stayover
( Stay_from, Stay_to, Total_price, ID_Room, ID_Guest, ID_Payment )
VALUES ( v_stayfrom, v_stayto, v_totalprice, v_roomID, v_guestID, v_paymentID );
END;
ELSE

BEGIN
raise_application_error( -20002, 'Room is taken!' );
END;
END IF;
END;
END;
DECLARE
v_guestID NUMBER;
v_stayfrom DATE;
v_stayto DATE;
v_roomID NUMBER;
v_paymentID NUMBER;
v_totalprice NUMBER;
BEGIN
v_guestID := 1;
v_stayfrom := '17.01.2012';
v_stayto := '19.01.2012';
v_roomID := 1;
v_paymentID := 1;
v_totalprice := 300;

Room_taken(
v_guestID => v_guestID,
v_stayfrom => v_stayfrom,
v_stayto => v_stayto,
v_roomid => v_roomid,
v_paymentID => v_paymentID,
v_totalprice => v_totalprice
);
END;
Connecting to the database HOTEL.
ORA-01403: no data found
ORA-06512: at "HOTEL_ROOMS.ROOM_TAKEN", line 18
ORA-06512: at line 16
Process exited.
Disconnecting from the database HOTEL.
我收到一个错误:

CREATE
PROCEDURE Room_taken
(
v_guestID IN NUMBER DEFAULT NULL ,
v_stayfrom IN DATE DEFAULT NULL ,
v_stayto IN DATE DEFAULT NULL ,
v_roomID IN NUMBER DEFAULT NULL ,
v_paymentID IN NUMBER DEFAULT NULL ,
v_totalprice IN NUMBER DEFAULT NULL 
)
AS
v_nofrom DATE;
v_noto DATE;
v_idroom NUMBER(10,0);

BEGIN

BEGIN
SELECT Stay_from, Stay_to     
INTO v_nofrom, v_noto
FROM Stayover
WHERE ID_room = v_roomID;
IF NOT ( v_nofrom >= v_stayfrom
AND v_noto <= v_stayto ) THEN

BEGIN
INSERT INTO Stayover
( Stay_from, Stay_to, Total_price, ID_Room, ID_Guest, ID_Payment )
VALUES ( v_stayfrom, v_stayto, v_totalprice, v_roomID, v_guestID, v_paymentID );
END;
ELSE

BEGIN
raise_application_error( -20002, 'Room is taken!' );
END;
END IF;
END;
END;
DECLARE
v_guestID NUMBER;
v_stayfrom DATE;
v_stayto DATE;
v_roomID NUMBER;
v_paymentID NUMBER;
v_totalprice NUMBER;
BEGIN
v_guestID := 1;
v_stayfrom := '17.01.2012';
v_stayto := '19.01.2012';
v_roomID := 1;
v_paymentID := 1;
v_totalprice := 300;

Room_taken(
v_guestID => v_guestID,
v_stayfrom => v_stayfrom,
v_stayto => v_stayto,
v_roomid => v_roomid,
v_paymentID => v_paymentID,
v_totalprice => v_totalprice
);
END;
Connecting to the database HOTEL.
ORA-01403: no data found
ORA-06512: at "HOTEL_ROOMS.ROOM_TAKEN", line 18
ORA-06512: at line 16
Process exited.
Disconnecting from the database HOTEL.

我做错了什么?

您得到了一个错误,因为
SELECT INTO
构造必须在PL/SQL中准确返回1行。您的第一次选择没有返回任何行,因此会引发
no\u DATA\u FOUND
错误

如果有2行(例如1月份的预订,2月份的预订),则会出现
行数过多
错误

相反,您要做的是确保如果插入,将不会有重叠。例如,以下查询将返回一段时间内的所有预订:

SELECT * 
  FROM Stayover 
 WHERE ID_room = v_roomID
   AND stay_from <= v_stayto 
   AND stay_to >= v_stayfrom 
现在,您每个时段只能预订一次房间:

SQL> EXEC Room_taken(1, trunc(SYSDATE), trunc(SYSDATE), 1);

PL/SQL procedure successfully completed

SQL> EXEC Room_taken(1, trunc(SYSDATE), trunc(SYSDATE), 1);

begin Room_taken(1, trunc(SYSDATE), trunc(SYSDATE), 1); end;

ORA-20002: Room is taken!
ORA-06512: à "APPS.ROOM_TAKEN", ligne 16
ORA-06512: à ligne 2
错误消息
ORA-01403:未找到任何数据

错误原因

您尝试了以下操作之一:

  • 您执行了SELECT INTO语句,但未返回任何行
  • 您引用了表中未初始化的行
  • 您使用UTL_文件包读取文件末尾
  • 显示建议的解决方案
    检查此链接

    我明白了。我现在可以在表中输入新的住宿数据,但如果在同一时间有人在同一房间,我无法使用您的代码引发“房间被占用”错误。。。这就是为什么我需要这个程序。我仍然不知道该怎么做。@drazen您正在插入
    NOCENJE
    表,并对照
    STAYOVER
    表进行检查。如果您在这两种情况下使用同一张桌子,您应该在事先预订的情况下得到“房间被占用”错误。对不起,我的错。我在代码中放错了列。。。它正在工作,非常感谢:)