运行创建的过程时发生Oracle错误
我有基于酒店客房住宿的Oracle数据库。 我已经创建了一个手术室,但我无法让它工作 这是我的SQL过程代码:运行创建的过程时发生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
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:未找到任何数据 错误原因 您尝试了以下操作之一:
检查此链接
我明白了。我现在可以在表中输入新的住宿数据,但如果在同一时间有人在同一房间,我无法使用您的代码引发“房间被占用”错误。。。这就是为什么我需要这个程序。我仍然不知道该怎么做。@drazen您正在插入
NOCENJE
表,并对照STAYOVER
表进行检查。如果您在这两种情况下使用同一张桌子,您应该在事先预订的情况下得到“房间被占用”错误。对不起,我的错。我在代码中放错了列。。。它正在工作,非常感谢:)