ORA-01403 в Oracle-APEX Formular - PullRequest
       16

ORA-01403 в Oracle-APEX Formular

0 голосов
/ 27 апреля 2018

У меня есть этот код. : P99_CAR,: P99_PARTS - это списки, которые вы можете выбрать ID (через таблицу поиска),: P99_AMOUNT - это простой ввод в мою форму. Таким образом, вы выбираете эти 3 части и хотите проверить следующий код. Поэтому, если PART_ID равен 5, а CAR_ID равен 3, и я выбираю те же номера из списка, то возникает ОШИБКА, и я не знаю, почему.

DECLARE
        --Varchar(100) or Number
      l_car Varchar(100);
      l_part Varchar(100);
    BEGIN
      SELECT CAR_ID, PART_ID INTO l_car, l_part FROM CAR_PARTS WHERE CAR_ID = :P99_CAR AND PARTS_ID = :P99_PARTS;
          IF l_car IS NULL OR l_parts IS NULL THEN 
              INSERT INTO CAR_PARTS (CAR_ID, PARTS_ID, CUR_AMOUNT) VALUES (:P99_CAR, :P99_PARTS, :P99_AMOUNT);
      ELSE
          UPDATE CAR_PARTS 
              SET CAR_ID = :P99_CAR,
                  PARTS_ID = :P99_PARTS,
                  CUR_AMOUNT = CUR_AMOUNT + :P99_AMOUNT
                      WHERE CAR_ID = :P99_CAR AND PARTS_ID = :P99_PARTS;
         END IF;
     END;

Но я получаю ORA-01403 Ошибка при обработке и при отправке этого

Ajax-вызов вернул ошибку сервера ORA-01403: данные для выполнения не найдены Код PL / SQL.

Я знаю, что мне нужно вставить Исключение с этой ОШИБКОЙ, но почему это происходит?

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Ваш оператор SELECT не возвращает никаких строк. Поскольку это работает в другой среде, ваши переменные связывания не такие, как вы думаете. В этом процессе вы должны добавить вызовы к apex_debug.message, а затем проверить, какие значения находятся в журнале отладки.

Однако я бы заменил весь ваш процесс одним оператором слияния:

MERGE INTO car_parts cp
USING ( SELECT :P99_CAR_ID AS car_id, :P99_PARTS ID AS parts_id, 
               :P99_CUR_AMOUNT AS cur_amount ) src
   ON ( cp.car_id = src.car_id AND cp.parts_id = src.parts_id )
 WHEN NOT MATCHED THEN INSERT ( car_id, parts_id, cur_amount )
      VALUES ( src.car_id, src.parts_id, src.cur_amount )
 WHEN MATCED THEN UPDATE SET cur_amount = src.cur_amount
0 голосов
/ 27 апреля 2018

Кажется, что следующий запрос не возвращает ни одной строки:

SELECT CAR_ID, PART_ID INTO l_car, l_part FROM CAR_PARTS WHERE CAR_ID = :P99_CAR AND PARTS_ID = :P99_PARTS;

Попробуйте обернуть его в блок BEGIN END и обработать исключение:

BEGIN
  SELECT CAR_ID, PART_ID 
  INTO l_car, l_part 
  FROM CAR_PARTS 
  WHERE CAR_ID = :P99_CAR AND PARTS_ID = :P99_PARTS;
EXCEPTION WHEN NO_DATA_FOUND THEN
-- Handle error here
END;
...