Как избежать символа подстановки и специального символа при поиске из интерфейса

#oracle #dynamic-sql

#Oracle #динамический-sql

Вопрос:

Предположим, у меня есть функция поиска во внешнем интерфейсе, написанная на Java. У меня есть текстовое поле для примера name. Когда я передаю имя или символ, он работает нормально, но когда я передаю какой-либо специальный символ, он не работает, потому что я отправляю этот параметр в процедуру oracle, которая использует динамический запрос.

Предположим, что запрос в моей процедуре таков:

 create or replace procedure abc
(abc IN  table.name%type
,p_abc   abc_cur 
)
is 
v_var varchar2(2000); 
begin
v_var:='select * from table where name LIKE '%'NVL(p_name,name)'%'';
open c1 for v_var;

end abc;
  

Когда я передаю [%,_ ,.], он выполняет поиск на основе символов подстановки, как вы видите в запросе.

Теперь, когда я передаю [‘] только тогда, он выдает исключение. Пожалуйста, подскажите мне решение, как справиться с этим, я не хочу рассматривать какие-либо специальные символы в запросе, и использование динамического запроса является обязательным.

ПРИМЕЧАНИЕ: Пожалуйста, смотрите, параметры в фигурных скобках [] разделяются запятой.

Я использую Oracle в качестве СУБД.

Ответ №1:

побег! Не позволяйте пользователю использовать%. Также остерегайтесь sql-инъекций. (Другие символы, на которые нужно указать «да», — это _ и ?)

Кстати, в oracle вы можете использовать что-то вроде

 SELECT * FROM TABLE_A WHERE FIELD LIKE '%sometext%%' escape by ''
  

С уважением

РЕДАКТИРОВАТЬ: я предпочитаю использовать курсор в циклах for

 for x in (select whatever from whenever) loop
   DBMS_OUTPUT.putLine(x.field);
end loop;
  

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