Как я могу хранить операторы sql в оракуле? - PullRequest
2 голосов
/ 16 февраля 2010

Нам нужно сохранить оператор выбора в таблице

select * from table where col = 'col'

Но одинарные кавычки портят оператор вставки.

Можно ли как-то это сделать?

Ответы [ 6 ]

7 голосов
/ 16 февраля 2010

Начиная с Oracle 10G, существует альтернатива удвоению одинарных кавычек:

insert into mytable (mycol) values (q'"select * from table where col = 'col'"');

Я использовал символ двойной кавычки ("), но вы можете указать другой, например ::

insert into mytable (mycol) values (q'@select * from table where col = 'col'@');

Синтаксис литерала:

q'<special character><your string><special character>'

Очевидно, что в таком маленьком примере он не так удобен для чтения, но он окупается большим количеством текста, например

insert into mytable (mycol) values (
   q'"select empno, ename, 'Hello' message
   from emp
   where job = 'Manager'
   and name like 'K%'"'
);
4 голосов
/ 16 февраля 2010

Как вы выполняете вставку? Если вы используете какой-либо провайдер на внешнем интерфейсе, он должен отформатировать строку для вас, чтобы кавычки не были проблемой.

По сути, создайте параметризованный запрос и присвойте значение оператора SQL экземпляру класса параметров, и пусть слой db позаботится об этом за вас.

3 голосов
/ 16 февраля 2010

вы можете использовать две кавычки '' для представления одной цитаты ' или (с 10g +) вы также можете использовать новую запись :

SQL> select ' ''foo'' ' txt from dual;

TXT
-------
 'foo'

SQL> select q'$ 'bar' $' txt from dual;

TXT
-------
 'bar'
2 голосов
/ 16 февраля 2010

Не хранить операторы SQL в базе данных !!

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

Кроме того, если вы используете 10 г, и вы должны сделать это: сделайте это правильно! По FAQ

Use the 10g Quoting mechanism:
Syntax
 q'[QUOTE_CHAR]Text[QUOTE_CHAR]'
 Make sure that the QUOTE_CHAR doesnt exist in the text.
SELECT q'{This is Orafaq's 'quoted' text field}' FROM DUAL;
2 голосов
/ 16 февраля 2010

Одиночные кавычки экранируются путем дублирования их:

INSERT INTO foo (sql) VALUES ('select * from table where col = ''col''')

Однако большинство библиотек баз данных предоставляют параметры связывания, поэтому вам не нужно заботиться об этих деталях:

INSERT INTO foo (sql) VALUES (:sql)

... и затем вы присваиваете значение: sql.

2 голосов
/ 16 февраля 2010

Если вы используете язык программирования, такой как JAVA или C #, вы можете использовать подготовленные (параметризованные) операторы для ввода своих значений и их извлечения.

Если вы находитесь в SQLPlus, вы можете избежать апострофов, напримерэто:

insert into my_sql_table (sql_command) 
values ('select * from table where col = ''col''');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...