Точная выборка возвращает больше, чем запрошено - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь написать хранимую процедуру. Мне нужно получить идентификатор факультета с помощью идентификатора. Идентификаторы уникальны, но когда я пытаюсь извлечь факультет, я получаю ошибку: точная выборка возвращает больше, чем запрошенные строки.

Я проверил много похожих вопросов о сообществе оракулов и переполнении стека, но не получил правильных ответов

Моя хранимая процедура выглядит следующим образом:

CREATE OR REPLACE PROCEDURE updateStatus(id IN int)

IS  

facid varchar2(10);

total_count int;

accepted_count int;

rejected_count int;

design varchar2(25);

BEGIN

    SELECT facultyid INTO facid FROM TEMP_LEAVE_DETAILS WHERE id=id;

    SELECT design INTO design FROM FACULTY WHERE facultyid=facid;

    SELECT COUNT(*) INTO total_count FROM CLASS_ADJUST WHERE id=id;

    SELECT COUNT(*) INTO accepted_count FROM CLASS_ADJUST WHERE id=id AND 

     accepted='Accepted';

    SELECT COUNT(*) INTO rejected_count FROM CLASS_ADJUST WHERE id=id AND 

     accepted='Rejected';

    IF(total_count=accepted_count) THEN

        IF design='hod' THEN

            UPDATE TEMP_LEAVE_DETAILS SET appr_by='Principal' WHERE id=id;

        ELSE

            UPDATE TEMP_LEAVE_DETAILS SET appr_by='HOD' WHERE id=id;

        END IF;

    END IF;

END;

Я получаюэта ошибка при выполнении процедуры:

BEGIN UPDATESTATUS (23);END;

*

ОШИБКА в строке 1:

ORA-01422: точная выборка возвращает больше запрошенного количества строк

ORA-06512: в"SYSTEM.UPDATESTATUS", строка 9

ORA-06512: в строке 1

Пожалуйста, помогите мне решить эту ошибку с помощью некоторого решения и, если возможно, объясните, почему это не работаетЗаранее спасибо

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Проблема в следующем:

where id = id

Это вернет все не NULL значения id.

Вам необходимо отличать столбцы от параметров.Я бы написал этот код как:

CREATE OR REPLACE PROCEDURE updateStatus (
    in_id IN int
) AS  
    v_facid varchar2(10);
    v_total_count int;
    v_accepted_count int;
    v_rejected_count int;
    v_design varchar2(25);
BEGIN
    SELECT facultyid INTO facid
    FROM TEMP_LEAVE_DETAILS tld
    WHERE tld.id = in_id;

    . . .
0 голосов
/ 20 ноября 2018
SELECT facultyid INTO facid FROM TEMP_LEAVE_DETAILS WHERE id=id;

Я не использовал oracle, но в SQL Server и MySQL этот запрос возвращает все facultyid (кроме случаев, когда id равен нулю), потому что id=id всегда истинно, если id не равно нулю, потому что null=null возвращает false.

Поскольку facid является varchar(10), он ожидает только одну строку.Вы хотите использовать другое условие в предложении where, изменив имя параметра id.

Кроме того, аналогичная проблема может возникнуть во втором запросе, если имеется много строк, которые соответствуютfacid

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...