2010-02-16 2 views
1

Мы должны хранить оператор выбора в таблицеКак хранить SQL-команды в таблице оракула?

select * from table where col = 'col' 

Но одиночные кавычки Messes вставного заявление вверх.

Возможно ли это как-то?

+2

любая причина, по которой вы храните инструкцию sql? –

+2

Сохраненные процедуры и/или функции были бы * намного лучшей идеей. Особенно, если они помещены в пакеты ... –

+0

@ Mitch Wheat Ну, на самом деле это немного сложно. Мы создаем сопоставление ключевых значений из таблицы, и каждый ключ имеет этот столбец sql наряду с другими атрибутами. Столбец sql будет указывать на таблицу, содержащую значения ключа. Дело в том, что этот столбец должен быть динамическим, поэтому значения ключа будут меняться при изменении столбца sql. Довольно сложный дизайн; да. – jonasespelita

ответ

7

От 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%'"' 
); 
+0

Хороший материал. Сегодня узнал что-то новое о 10g. – jonasespelita

4

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

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

2

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

Если вы в SQLPlus вы можете избежать апостроф так:

insert into my_sql_table (sql_command) 
values ('select * from table where col = ''col'''); 
2

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

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

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

INSERT INTO foo (sql) VALUES (:sql) 

... а затем вы Значение ssign для: sql.

3

вы можете использовать две кавычки '' представлять апостроф ' или (с 10г +) вы можете также использовать new notation:

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

TXT 
------- 
'foo' 

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

TXT 
------- 
'bar' 
2

Не храните SQL заявления в базе данных !!

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

Также, если вы используете 10g, и вы должны сделать это: сделайте это правильно! Согласно 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; 
+0

sql динамически генерируется. Сумасшедший .. но нужен. Спасибо за совет! – jonasespelita

+0

Он не генерируется динамически, он экранируется с помощью синтаксиса 'q '/ text /' q', так что'/'может быть любым символом. –

Смежные вопросы