Oracle Выполнить немедленно, не экранируя кавычки? - PullRequest
0 голосов
/ 04 августа 2020
DECLARE
  v_column_exists number := 0;  
BEGIN
  Select count(*) into v_column_exists
    from user_tab_cols
    where upper(column_name) = 'MyCoolColumn'
      and upper(table_name) = 'MyCoolTable';

  if (v_column_exists = 0) then
      execute immediate 'alter table MyCoolTable add (MyCoolColumn varchar2(255))';
      execute immediate 'update MyCoolTable set MyCoolColumn = 'NULL'';
  end if;
end;
/

К сожалению, я получаю сообщение об ошибке oracle

ORA-06550 PLS-00103 Встречный символ «NULL» при ожидании .....

в строке:

execute immediate 'update MyCoolTable set MyCoolColumn = 'NULL'';

Я знаю, что вставляю слово «NULL», а не нулевое значение. Я добавляю этот столбец в существующую таблицу, и мне нужно сделать его Not Null и первичным ключом с двумя другими столбцами первичного ключа. Если я удалю проблемную строку, оператор будет выполнен нормально.

Я неправильно экранировал 'Null'?

Ответы [ 2 ]

2 голосов
/ 04 августа 2020

Альтернативный способ справиться с этим:

execute immediate q'[update MyCoolTable set MyCoolColumn = 'NULL']';
1 голос
/ 04 августа 2020
execute immediate 'update MyCoolTable set MyCoolColumn = ''NULL''';

вам понадобятся две кавычки, чтобы избежать 1-го ', затем тройные кавычки для конца, одна для escape-последовательности и вторая для завершения строки.

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