Проблема с точкой с запятой в сценарии SQL - PullRequest
0 голосов
/ 27 июня 2019

Мне нужно обновить значение столбца с помощью хранимой процедуры, которая содержит точку с запятой, и это вызывает проблему «строка в кавычках неправильно завершилась».

Подключено к серверу с помощью Putty и выполняет команду с использованием SQL Plus

Пробовал использовать /; но это не сработало

update dummy_table
  set
  col1 = 0, col2 = null, col3 = to_clob(
    'declare
    source_table varchar2(40) := :par1;
    target_table_name varchar2(40) := :par2;
    '||'
    begin  '||'
    select * from temp_table;
    end;
    '||'/'
  ), col4 = null
  where col5 = 'value_1' and col6 = 'value_7';

ER: Команда должна успешно выполниться и обновить col3 с заданным значением

AR: строка в кавычках не окончена правильно

Ответы [ 3 ]

1 голос
/ 27 июня 2019

Точка с запятой указывает SQLPlus, что вы хотите запустить введенную команду в качестве команды.Он не выглядит первым, чтобы увидеть, что вы находитесь в середине строки в кавычках.Чтобы прекратить это действие, заключите всю команду в отдельный блок, где точка с запятой будет считаться частью блока, а не пытайтесь выполнить введенное вами ранее.Блоки окружены ключевыми словами BEGIN и END.Скажите SQLPlus, что вы сделали, введя точку в отдельной строке, затем запустите блок, введя косую черту.

Итак, если бы вы вводили SQL * Plus, это выглядело бы так:

BEGIN
update dummy_table
  set
  col1 = 0, col2 = null, col3 = to_clob(
    'declare
    source_table varchar2(40) := :par1;
    target_table_name varchar2(40) := :par2;
    '||'
    begin  '||'
    select * from temp_table;
    end;
    '||'/'
  ), col4 = null
  where col5 = 'value_1' and col6 = 'value_7';
END;
.
/
0 голосов
/ 28 июня 2019

SQLPlus, похоже, не нравится точка с запятой в конце строки, независимо от того, являются ли они частью строки в кавычках или нет.Это работает, и это то же самое, что и ваше утверждение, но с добавлением разрывов строк (CR + LF):

update dummy_table
    set
    col1 = 0, col2 = null, col3 = to_clob(
      'declare
      source_table varchar2(40) := :par1;' || chr(10) || chr(13) ||'
      target_table_name varchar2(40) := :par2;' || chr(10) || chr(13) ||'
      '||'
      begin  '||'
      select * from temp_table;' || chr(10) || chr(13) ||'
      end;' || chr(10) || chr(13) ||'
      '||'/'
    ), col4 = null
    where col5 = 'value_1' and col6 = 'value_7';
0 голосов
/ 28 июня 2019

Вы можете использовать альтернативную технику механизма цитирования Oracle, как указано в следующем решении:

UPDATE DUMMY_TABLE
SET
    COL1 = 0,
    COL2 = NULL,
    COL3 = TO_CLOB('declare
    source_table varchar2(40) := :par1;
    target_table_name varchar2(40) := :par2;
    '
    || '
    begin  '
    || '
    select * from temp_table;
    end;
    '
    || q'#/#'),
    COL4 = NULL
WHERE
    COL5 = 'value_1'
    AND COL6 = 'value_7';

Строка, которая содержит любые специальные зарезервированные для оракула символы и если вы хотите рассматривать ее как строку, то вынеобходимо использовать строку в кавычках: q'<Special symbol><Your string><Special symbol>'.

Пожалуйста, обратитесь к Альтернативному механизму цитирования техника Oracle в документации Oracle.

...