Как экранировать da sh на oracle при обновлении таблицы - PullRequest
0 голосов
/ 22 апреля 2020

Поначалу это может показаться дублирующим вопросом, но я перепробовал все варианты, которые нашел, и у меня ничего не работает.

Это пример выражения, которое я пытаюсь выполнить:

UPDATE table_name SET column_name = 'REER – montant minimum'

ON SELECT Я получаю: REER ¿ montant minimum

  • в соответствии с Oracle документацией. У меня есть 2 способа экранирования специальных символов:

    {} для экранирования строки символов или символов

    \ для экранирования одного символа или символа (в моем случае, но я также пытался {} на всякий случай)

    ON SELECT Я получаю : REER \¿ montant minimum ИЛИ REER {¿} montant minimum

  • Я также попытался УСТАНОВИТЬ ESCAPE ON и получаю ошибку:

    ORA-00922: отсутствует или недействителен параметр

  • нашел в другом месте и попытался '||' - '||'

    Само собой разумеется, это не сработало.

    ON SELECT Я получаю: '||'-'||'

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Если у вас есть данные:

CREATE TABLE table_name (
  id NUMBER,
  column_name VARCHAR2(50)
);

INSERT INTO table_name
SELECT 1, '1' FROM DUAL UNION ALL
SELECT 2, '2' FROM DUAL;

Тогда, если я скопирую / вставлю ваше обновление:

UPDATE table_name
SET column_name = 'REER – montant minimum'
WHERE  id = 1;

, и если я наберу его вручную, то:

UPDATE table_name
SET column_name = 'REER - montant minimum'
WHERE  id = 2;

Тогда:

SELECT id, column_name, DUMP(column_name)
FROM table_name;

Выходы:

ID | COLUMN_NAME              | DUMP(COLUMN_NAME)                                                                                                            
-: | :----------------------- | :----------------------------------------------------------------------------------------------------------------------------
 1 | REER ??? montant minimum | Typ=1 Len=30: 82,69,69,82,32,239,191,189,239,191,189,239,191,189,32,109,111,110,116,97,110,116,32,109,105,110,105,109,117,109
 2 | REER - montant minimum   | Typ=1 Len=22: 82,69,69,82,32,45,32,109,111,110,116,97,110,116,32,109,105,110,105,109,117,109                                 

дБ <> скрипка здесь

В чем разница между и -?

  • Первым является символ из расширенного набора символов и DUMP выводит 239,191,189,239,191,189,239,191,189 (9 байт) для этот персонаж; тогда как
  • Второй - это символ из базового набора символов ASCII, и DUMP выводит 45 (1 байт) для этого символа.

Если вы хотите изменить один тогда к другому:

UPDATE table_name
SET column_name = REPLACE( column_name, '–', '-' );

db <> скрипка здесь

1 голос
/ 22 апреля 2020

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

Оператор обновления обычно должен работать:

CREATE TABLE t(
a VARCHAR2(50)
);

INSERT INTO t(a) VALUES ('Hello - blah blah');
UPDATE t SET a = 'REER – montant minimum';
SELECT * FROM t;

A                                                 
------------------------
REER – montant minimum

Если вы не можете просматривать символы , тогда ваши locale-speci c NLS settings не могут отобразить символ. Вы можете проверить это, поместив выходные данные в файл HTML и открыв его в браузере, поскольку большинство браузеров поддерживают глобализацию:

sqlplus user@pass/service
SET MARKUP HTML ON SPOOL ON
SPOOL C;\your_directory\output.html
SELECT column_name FROM table_name;
SPOOL OFF
SET MARKUP HTML OFF

Теперь откройте файл output.html в своем браузере и посмотрите, есть ли данные отображается правильно.

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