Я получаю эту ошибку, когда я пытаюсь вставить данные в моей процедуре:PLSQL Ошибка при попытке вставить запись
Error starting at line : 48 in command -
BEGIN
OPEN_CLASS('PRAC_4', 'ISYS224', 'Tue', '09:00', 'P', 'E6A123');
END;
Error report -
ORA-01427: single-row subquery returns more than one row
ORA-06512: at "43053327.OPEN_CLASS", line 18
ORA-06512: at line 2
01427. 00000 - "single-row subquery returns more than one row"
*Cause:
*Action:
Моя процедура в данный момент (отлично работает с другими тестами IV запуска до сих пор) :
CREATE OR REPLACE PROCEDURE OPEN_CLASS(
p_class IN TUTPRAC.CLASSID%TYPE,
p_unitc IN TUTPRAC.UNITCODE%TYPE,
p_classd IN TUTPRAC.CLASS_DAY%TYPE,
p_classt IN TUTPRAC.CLASS_TIME%TYPE,
p_classtp IN TUTPRAC.CLASS_TYPE%TYPE,
p_roomnm IN TUTPRAC.ROOMNUM%TYPE)
IS
-- Variables
x number:=0;
y number:=0;
CLASS_OVERLAPS EXCEPTION;
BEGIN
-- checks
SELECT nvl((SELECT 1 FROM TUTPRAC WHERE UNITCODE = p_unitc and CLASS_DAY = p_classd or CLASS_DAY = p_classd and CLASS_TIME = p_classt and ROOMNUM = p_roomnm) , 0) INTO x FROM dual;
SELECT nvl((SELECT 1 FROM UNITSTREAM WHERE UNITCODE = p_unitc and DAY = p_classd or DAY = p_classd and TIME = p_classt and LOCATION = p_roomnm) , 0) INTO y FROM dual;
-- insert
IF (x = 0 and y = 0) THEN
INSERT INTO TUTPRAC (CLASSID, UNITCODE, CLASS_DAY, CLASS_TIME, CLASS_TYPE, ROOMNUM)
VALUES (p_class, p_unitc, p_classd, p_classt, p_classtp, p_roomnm);
ELSE
RAISE CLASS_OVERLAPS;
END IF;
EXCEPTION
WHEN CLASS_OVERLAPS
THEN
RAISE_APPLICATION_ERROR(-20001,'The class you have tried to insert is clashing with an existing class.');
END OPEN_CLASS;
В моей процедуре проверяется, не вставлена ли вставленная запись класса с любыми классами, уже находящимися в таблице. Эта процедура работала для каждого тестового примера, который я пытался до сих пор, кроме этого.
Похоже, что первый оператор SELECT в строке 18 возвращает более одной строки, поэтому оператор SELECT INTO вызывает исключение. –
@MarcoBaldelli его 'select 1' как его returnng больше, чем строка? Я думаю, проблема с NVL – Moudiz
Как я исправить это? разрешить оператору возвращать более 1 строки? @MarcoBaldelli – CM25