Как я могу исправить ошибку для хранимой процедуры Oracle PL / SQL? - PullRequest
0 голосов
/ 05 декабря 2018

Я хочу решить эту проблему:

  • Создать хранимую процедуру с именем insert_num_proc, которая будет вставлять числа в таблицу FLOAT_SAMPLE.
  • Эта процедура должна иметь два параметра, по одному для каждого из двух столбцов в этой таблице.
  • Процедура должна проверить столбец float_id, чтобы убедиться, что в нем нет дубликатов (поскольку в этом столбце не применяются уникальные значения).Если есть дубликат float_id, то строка не должна вставляться, вместо этого печатается сообщение «Двойное значение в float_id».

Ниже приведен мой запрос.Для второго запроса я выполняю свою хранимую процедуру, чтобы увидеть, показывает ли она мое сообщение об ошибке приложения, и оно не работает.

CREATE OR REPLACE PROCEDURE insert_num_proc
(
float_id_param      float_sample.float_id%TYPE,
float_value_param   float_sample.float_value%TYPE)
AS
float_checker   float_sample.float_id%TYPE;
 BEGIN

SELECT float_id INTO float_checker FROM float_sample;

INSERT INTO float_sample (float_id, float_value) 
VALUES
(float_id_param, float_value_param);

 IF float_checker = float_id_param THEN
 RAISE_APPLICATION_ERROR(-20001, 'Duplicate value is inserted.'); 
 END IF;

 END;
 /

  EXECUTE insert_num_proc(3,2);

Ниже приведено сообщение об ошибке, которое я получаю

Отчет об ошибке - ORA-01422: точная выборка возвращает больше запрошенного числа строк ORA-06512: в «DL29232.INSERT_NUM_PROC», строка 9 ORA-06512: в строке 1 01422. 00000 - «точная выборка возвращает больше запрошенного количества строк"* Причина: число, указанное в точном извлечении, меньше возвращаемых строк.* Действие: переписать запрос или изменить количество запрошенных строк

1 Ответ

0 голосов
/ 05 декабря 2018

Отсутствует предложение WHERE, чтобы проверить, существует ли этот идентификатор, поэтому он возвращает несколько строк, которые не может содержать одна статическая переменная float_checker.

Другая проблема состоит в том, что, если у вас нет записи в таблице, ваш оператор выбора завершится ошибкой с исключением no_data_found.

Итак, определите ваш float_checker по-другому, чтобы он сохранил счет.

Далее, ваш INSERT должен следовать после условия IF

CREATE OR REPLACE PROCEDURE insert_num_proc (
     float_id_param      float_sample.float_id%TYPE,
     float_value_param   float_sample.float_value%TYPE
) AS
     float_checker   INTEGER := 0;
BEGIN
     SELECT COUNT(*)
       INTO float_checker
     FROM float_sample  WHERE 
     float_id = float_id_param;  --where clause for the passed id.


     IF float_checker > 0
       THEN
          raise_application_error(-20001,'Duplicate value is inserted.');
     END IF;

     INSERT INTO float_sample (
          float_id,
          float_value
     ) VALUES (
          float_id_param,
          float_value_param
     );

END;
/

Так как это упражнение, можно использовать этот код.Но в сценарии реального времени 3-е требование должно обрабатываться UNIQUE CONSTRAINT в таблице.

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