Избегайте амперсанда в PL / SQL Developer

Я пробую простой оператор INSERT для базы данных Oracle. Одно из значений - это поле VARCHAR2, а оператор вставки содержит амперсанд. Как мне это сделать? Я пробовал следующие методы:

  1. Экранируйте & как \ & с установкой escape на
  2. отключить сканирование (это вызывает ошибку отсутствия или недопустимого параметра ORA-00922)
  3. установить определение off (это вызывает ошибку отсутствия или недопустимого параметра ORA-00922)

Есть другие идеи?


person Ray Booysen    schedule 18.08.2011    source источник
comment
Я решил это с помощью решения chr (38) в этом вопросе: stackoverflow.com/questions/1137354/, но хотелось бы чего-то более изящного.   -  person Ray Booysen    schedule 18.08.2011
comment
Вы пытаетесь выполнить вставку через окно SQL или командное окно?   -  person Adam Paynter    schedule 18.08.2011
comment
Рэй, вы пробовали установить определение для другого персонажа, а не просто отключить его полностью? Не уверен, что это поможет, потому что я не использую PLSQL Developer, но может ...   -  person Ollie    schedule 18.08.2011
comment
Окно SQL. Это особенно важно, поскольку наша группа развертывания (хорошо это или плохо) также следует этой процедуре.   -  person Ray Booysen    schedule 18.08.2011
comment
@ Олли, да, это было. тот же результат.   -  person Ray Booysen    schedule 18.08.2011
comment
Только командное окно имитирует переменные SQL * Plus set, отсюда и синтаксические ошибки в вашем окне SQL. Также в SQL (или в PL / SQL Developer) нет «escape-символа», кроме как части выражения like, поэтому ваш \ не распознается.   -  person William Robertson    schedule 15.11.2015


Ответы (7)


Внизу окна SQL есть кнопка для отключения / включения переменных подстановки:

введите описание изображения здесь

person William Robertson    schedule 15.11.2015
comment
Это было трудно найти. Я потратил 10 минут на просмотр всех опций в настройках и только потом нашел это в сети. - person Tomas Greif; 11.01.2018

Как я решил, это экранирование & с другим &.

Например:

INSERT INTO Foo (Bar) VALUES ('Up && Away');

Хорошо работает. Спасибо за помощь

person Ray Booysen    schedule 18.08.2011
comment
действительно, но будьте осторожны, чтобы не заменять & на && с помощью собственного инструмента поиска и замены plsqld, так как он может зайти в бесконечный цикл. - person roselan; 07.08.2014
comment
Не для меня ... мое решение было ответом ... INSERT INTO tablex VALUES ('Sid' || '&' || 'Nancy'); ... - person Eugenio F. Martinez Pacheco; 29.01.2015

Одна из особенностей PL / SQL Developer, с которой нужно время, чтобы познакомиться, - это множество различных типов окон.

Одно из них - это окно КОМАНДА, которое по сути представляет собой эмулятор SQL * Plus. Мы можем запускать команды SQL * Plus, а также SQL, поэтому SET ESCAPE, SET DEFINE и действительно SET SCAN OFF работают в этом окне.

person APC    schedule 18.08.2011

Вы пробовали что-то подобное?

INSERT INTO tablex VALUES ('Sid ' || '&' || ' Nancy');

Улучшая мой первый ответ, ваша проблема связана с PL / SQL Developer. Если вы выполняете свой блок в окне команд разработчика PL / SQL, вы также можете использовать стандартный SET DEFINE OFF, который работает так же, как в SQL * Plus.

person Aitor    schedule 18.08.2011
comment
Я не думаю, что это более изящно, чем решение chr(38), которое упоминает Рэй. - person APC; 18.08.2011
comment
возможно, но это тот, который я использовал, когда столкнулся с подобной проблемой год назад. В orafaq.com/wiki/SQL_FAQ также есть несколько хороших решений в SQL * Plus, например SET ESCAPE '\', SET DEFINE ~ или SET SCAN OFF - person Aitor; 18.08.2011
comment
Хорошее решение и приятнее, чем возиться с глобальными настройками. Чуть короче: «Сид &» || «Нэнси». - person Hans-Peter Störr; 25.07.2012

concat отлично работал у меня ниже, это то, что я сделал в своем операторе select:

select FUND_NM
FROM PERFORMANCE
WHERE upper(FUND_DESC) in ('My L&' ||'L FUNDS')
person NSC    schedule 03.10.2012

Я использую chr(38) там, где мне нужен амперсанд в PL / SQL.

addr:= 'mysite.com/order.aspx?no=5678' || CHR(38) || 'id=947';
--above line gives you 'mysite.com/order.aspx?no=5678&id=947';
person mason    schedule 27.01.2015

Это просто проблема редактора SQL. Чтобы решить эту проблему, просто скомпилируйте процедуру с SET DEFINE OFF; . Выполнение, которое является PL (выполняется на сервере), не столкнется с этой проблемой.

person Saurabh Srivastava    schedule 24.07.2017