Обработка ORA-01403: данные не найдены - PullRequest
1 голос
/ 07 марта 2019

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

BEGIN
  OPEN C_TABLE_PARTITON_LIST;
  LOOP
    FETCH C_TABLE_PARTITON_LIST INTO TABLE_PARTITION_LIST;
    EXIT WHEN C_TABLE_PARTITON_LIST%NOTFOUND;  
    SELECT COLUMN_NAME INTO PARTITION_COLUMN_NAME from ALL_PART_KEY_COLUMNS 
    sqlstring :='SELECT ( '|| PARTITION_COLUMN_NAME ||'from test';
    EXECUTE IMMEDIATE sqlstring INTO F_RESULT;  
    exception when no_data_found then
      dbms_output.put_line('no data found.');
      DBMS_OUTPUT.put_line( F_RESULT);

  END LOOP;
  CLOSE C_TABLE_PARTITON_LIST;
END;

Когда я добавляю исключение, мой код ломается с ошибкой ниже

PLS-00103: Обнаружен символ «ИСКЛЮЧЕНИЕ» при ожидании одного из следующих действий:
(начинайте регистр, объявляйте конец выхода для goto, если цикл mod null прагма поднять возврат выбрать обновление в то время как с << продолжить закрыть текущий удалить извлечение блокировки вставить открытый откат набор точек сохранения sql выполнить коммит для очистки канала слияния json_exists json_value json_query json_object json_array <br> ORA-06550: строка 29, столбец 3:
PLS-00103: Обнаружен символ «ЗАКРЫТЬ» при ожидании одного из следующих действий:
конец не прагма конечный инстанцируемый порядок, перекрывающий статический карта конструктора-члена

1 Ответ

2 голосов
/ 07 марта 2019

Вы должны заключить поврежденную часть скрипта в свой собственный блок BEGIN-EXCEPTION-END, например,

BEGIN
  OPEN C_TABLE_PARTITON_LIST;
  LOOP
    FETCH C_TABLE_PARTITON_LIST INTO TABLE_PARTITION_LIST;
    EXIT WHEN C_TABLE_PARTITON_LIST%NOTFOUND;  

    begin     --> you need this ...

      SELECT COLUMN_NAME INTO PARTITION_COLUMN_NAME from ALL_PART_KEY_COLUMNS 
      sqlstring :='SELECT ( '|| PARTITION_COLUMN_NAME ||'from test';
      EXECUTE IMMEDIATE sqlstring INTO F_RESULT;  
    exception when no_data_found then
      dbms_output.put_line('no data found.');
      DBMS_OUTPUT.put_line( F_RESULT);

    end;      --> ... and this

  END LOOP;
  CLOSE C_TABLE_PARTITON_LIST;
END;

Обратите внимание, что я только что показал способ сделать это. Код, который вы разместили

  • является неполным (пропускает раздел DECLARE)
  • недопустимо (SELECT в операторе отсутствует точка с запятой, и, возможно, WHERE предложение
  • SQLSTRING переменная не будет работать; 'from test' должен иметь начальный пробел, в противном случае это утверждение будет недействительным
  • Я предлагаю вам сначала DBMS_OUTPUT SQLSTRING, чтобы убедиться, что это правильно; затем выполните его.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...