2015-10-25 6 views
2

Я получаю эту ошибку, когда я пытаюсь вставить данные в моей процедуре: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; 

В моей процедуре проверяется, не вставлена ​​ли вставленная запись класса с любыми классами, уже находящимися в таблице. Эта процедура работала для каждого тестового примера, который я пытался до сих пор, кроме этого.

+0

Похоже, что первый оператор SELECT в строке 18 возвращает более одной строки, поэтому оператор SELECT INTO вызывает исключение. –

+0

@MarcoBaldelli его 'select 1' как его returnng больше, чем строка? Я думаю, проблема с NVL – Moudiz

+0

Как я исправить это? разрешить оператору возвращать более 1 строки? @MarcoBaldelli – CM25

ответ

1
ORA-01427: single-row subquery returns more than one row 
ORA-06512: at "43053327.OPEN_CLASS", line 18 

ошибка происходит из-за того, что ваш ВЫБОР .. INTO оператор дает несколько строк, однако, он должен генерировать только одну строку.

Выполните команду SQL без предложения INTO, чтобы проверить количество возвращенных строк и поместить необходимый файл. Если вы хотите выбрать один ряд, вы можете ограничить строки до 1, используя ROWNUM.

SELECT COUNT(*) FROM 
(
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) FROM dual 
); 

SELECT COUNT(*) FROM 
(
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) FROM dual 
); 

SELECT 1 не означает, что она будет возвращать одну строку, он просто возвращает значение 1 для каждой строки извлеченной. Если вы хотите, чтобы ограничить количество строк, то:

  • ROWNUM
  • ряд ограничивающих особенность FETCH в 12c.

UPDATE

комментарий Per OP в ниже, COUNT требуется.

SELECT COUNT(*) 
INTO x 
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; 

SELECT COUNT(*) 
INTO y  
FROM UNITSTREAM 
WHERE UNITCODE = p_unitc 
AND DAY = p_classd or DAY = p_classd 
AND TIME = p_classt and LOCATION = p_roomnm; 
+0

Увеличивает ли это мои переменные X и Y? потому что я использую те, которые проверяют наличие столкновений, если X и/или Y> 0, тогда запись не будет вставляться в таблицу @Lalit Kumar B – CM25

+0

@ CM25 Я думаю, вам нужно использовать ** COUNT ** вместо ** 1 **. –

+0

@ CM25 См. Обновление. –

Смежные вопросы