#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;
это избавляет меня от управления замыканиями в обработчиках исключений и синтаксисе курсора