Ошибка при вставке данных с одинарными кавычками - PullRequest
0 голосов
/ 19 ноября 2011

У меня есть приложение, которое сохраняет данные в базе данных.Предположим, когда я помещаю текст в текстовое поле и затем нажимаю «Сохранить».Он вызовет процедуру, которая вставит этот текст (clob) в таблицу базы данных.

Предположим, у меня есть следующий текст:

Привет, я сын Сони Гаурава

Теперь моя процедура принимает эти данные сгустка как:

insert into rtf_clob(1,'Hi i am gaurav's soni's');

Это, однако, приводит к ошибке.

Как обработать эту одинарную кавычку в динамических данных, поступающих из внешнего интерфейса?
Я использую оракул в качестве RDBMS.

Ответы [ 2 ]

3 голосов
/ 19 ноября 2011

Вы не должны писать код для экранирования строки. Тот факт, что вам нужно экранировать строку, означает, что вы делаете что-то не так.

Если вы используете переменные связывания в вашем операторе INSERT, вам не нужно будет экранировать строку, если есть одиночная кавычка. Также не нужно будет пытаться идентифицировать атаки SQL-инъекций в строке, что является серьезной проблемой безопасности, если вы не используете переменные связывания. И вы не будете заставлять Oracle анализировать запрос каждый раз, когда он выполняется, что крайне важно для производительности системы.

Если процедура, о которой вы говорите, написана на PL / SQL, она будет автоматически использовать переменные связывания. Догадываясь по именам столбцов и предполагая, что вы используете последовательность для генерации вашего первичного ключа, у вас будет что-то вроде этого

CREATE PROCEDURE insert_rtf_clob( p_clob IN NOCOPY CLOB )
AS
BEGIN
  INSERT INTO rtf_clob( rtf_clob_id, rtf_clob_value )
    VALUES( seq_rtf_clob_id.nextval, p_clob );
END;

Другие языки интерфейса будут иметь разные подходы к использованию переменных связывания. Например, если вы пишете Java с использованием JDBC, вы должны создать PreparedStatement, а затем вызвать соответствующие методы setXXX, т.е.

PreparedStatement stmt = conn.prepareStatement( "INSERT INTO rtf_clob VALUES( ?, ? )" );
stmt.setInt( 1, 1 ); // Set column 1 to a value of 1
stmt.setString( 2, someStringVariable ); // Set column 2 to someStringVariable
stmt.executeUpdate();
1 голос
/ 19 ноября 2011

Удвоить ': вставить в rtf_clob (1, "Привет, я сын Гаурава");

...