#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, и эта программа добавила пробел, который вызвал ошибку. Я пришел к мысли, что это было плохо написано, но я не видел ошибки.