Как записать этот анонимный блок?

#oracle #plsql

#Oracle #plsql

Вопрос:

Я пытаюсь использовать анонимный блок для двойного обновления, но у меня это не работает. Что я делаю не так?

 DECLARE  
   v_voucher NUMBER(10) := 4329;
BEGIN

   UPDATE PRODUCTION 
   SET 
     UND_PROD = 0,
     UND_DET = 0
   WHERE 
     VOUCHER = v_voucher;
 
   UPDATE DET_PRODUCTION 
   SET 
     UND_GOOD = 0,
     UND_BAD = 0
   WHERE 
     VOUCHER = v_voucher;
 
END;
  

ORA-06550: строка 9, столбец 1:
PLS-00103: столкнулся с символом » » при ожидании одного из следующих:

( begin case объявить end исключение exit для goto if loop mod null pragma raise return выбрать обновление, используя [идентификатор] [идентификатор с разделителями в двойных кавычках] [переменную привязки] продолжить закрыть текущее удалить выборку заблокировать вставить открыть откат точки сохранения установить sql выполнить фиксацию для всех очистка канала слияния

Комментарии:

1. Есть ли у вас какой-либо код до или после этого анонимного блока?

2. Я создал таблицу, подобную вашей, и после выполнения кода я получил: Процедура PL / SQL успешно завершена.

Ответ №1:

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

Если я скопирую код из окна редактирования и дамп, что там в строке перед вторым обновлением C2A0 .

 select dump ('  WHERE VOUCHER = v_voucher;
     
    UPDATE DET_PRODUCTION SET 
', 1016) from dual;

DUMP('WHEREVOUCHER=V_VOUCHER; UPDATEDET_PRODUCTIONSET',1016)                                                                                                                                                      
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Typ=96 Len=60 CharacterSet=AL32UTF8: 9,57,48,45,52,45,20,56,4f,55,43,48,45,52,20,3d,20,76,5f,76,6f,75,63,68,65,72,3b,a,9,c2,a0,a,9,55,50,44,41,54,45,20,44,45,54,5f,50,52,4f,44,55,43,54,49,4f,4e,20,53,45,54,20,a
                                                                                                                         ^^^^^
  

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

Или скопируйте отображаемый блок из вашего вопроса и запустите его — символ-мошенник не является проблемой, как только необработанный код (который вы можете увидеть только путем редактирования) был обработан как Markdown.

Не уверен, откуда это могло взяться; возможно, вы написали это во внешней программе, такой как Word, и она добавила специальные символы, как это имеет обыкновение делать…

Комментарии:

1. Спасибо, Алекс, фактически там был скрытый символ, я сохранил этот код в Microsoft OneNote, и эта программа добавила пробел, который вызвал ошибку. Я пришел к мысли, что это было плохо написано, но я не видел ошибки.