Одинарная кавычка в переменной немедленного выполнения - PullRequest
0 голосов
/ 04 июня 2019

У меня есть хранимая процедура, которая имеет:

execute immediate 'SELECT COUNT(S_NM) FROM '||lc_s_d_tb_nm||' WHERE S_NM IN('''||in_s_nm||''') AND '||lc_s_t_col||'='''||in_s_type||''' ' into lc_s_count;

Параметр in_s_nm отправляется другой функцией, и одно из значений - Test - Mother's Identifier

Из-за '(апостроф), мой sql не работает.

Как это исправить, чтобы он работал?

Ответы [ 3 ]

2 голосов
/ 04 июня 2019

На этом следует остановиться. Не повторяю, никогда не используйте конкатенацию значений в динамическом SQL (за исключением имен таблиц и столбцов или в образовательных целях: -; ). Он уязвим для SQL-инъекций и может стать угрозой безопасности.

Ваш запрос должен быть переписан как

EXECUTE IMMEDIATE 'SELECT COUNT(S_NM) FROM '||lc_s_d_tb_nm||' 
   WHERE S_NM = :s_nm
AND '||lc_s_t_col||'= :s_type'  into lc_s_count  USING in_s_nm,in_s_type;

DEMO

1 голос
/ 04 июня 2019

Просто используйте replace(in_s_nm, '''', '''''') вместо in_s_nm.

0 голосов
/ 04 июня 2019

В 10g Oracle представила Оператор цитирования в качестве альтернативы или, скорее, расширение, которое устраняет, по крайней мере, большинство, если не все, эту проблему двойных кавычек.Например, попробуйте:

select q'/this is a single quote ', and this a double '' and even a triple '''/' from dual
union all 
select 'this is a single quote '', and this a double '''' and even a triple ''''''' from dual;

Я думаю, с первым гораздо легче справиться, чем со вторым, хотя они дают одинаковый результат.

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