powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Экранирование в динамическом sql
11 сообщений из 11, страница 1 из 1
Экранирование в динамическом sql
    #40062918
scorpion235
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Друзья, подскажите как корректно экранировать входящий параметр в динамический sql хранимки?
В моем случае это переменная: :P_COMMENT
Получилось победить только таким образом:

авторSQL_STR = 'SELECT ID,'
|| ' BDATE,'
|| ' EDATE,'
|| ' COMMENT'
|| ' FROM ERRANDS'
|| ' WHERE ((PKB_UTILS.ISNULL(:P_COMMENT)) OR (NOT PKB_UTILS.ISNULL(:P_COMMENT) AND LOWER(COMMENT) LIKE LOWER(''%'|| :P_COMMENT ||'%'')))'
|| ' AND BDATE >= :P_BDATE AND EDATE <= :P_EDATE';

FOR EXECUTE STATEMENT (SQL_STR)
(P_COMMENT := P_COMMENT,
P_BDATE := P_BDATE,
P_EDATE := P_EDATE)
INTO :ID,
:BDATE,
:EDATE,
:COMMENT
DO
SUSPEND;
...
Рейтинг: 0 / 0
Экранирование в динамическом sql
    #40062925
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scorpion235,

смотри
C:\Program Files\Firebird\Firebird_3_0\doc\sql.extensions\README.alternate_string_quoting.txt
...
Рейтинг: 0 / 0
Экранирование в динамическом sql
    #40062940
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scorpion235,

Если это не пример то EXECUTE STATEMENT возможно лишний ибо

Код: sql
1.
LOWER(COMMENT) LIKE LOWER('%.....%')


почти всегда стр.69 эквивалентен
Код: sql
1.
COMMENT  containing  '.....'



и тогда получается
Код: sql
1.
2.
3.
4.
5.
for select Id, Bdate, Edate, Comment  
        from Errands
        where (Pkb_Utils.Isnull(:P_Comment) or Comment containing :P_Comment)
            and :P_Bdate between Bdate and Edate
....


что как по мне гораздо проще для восприятия
...
Рейтинг: 0 / 0
Экранирование в динамическом sql
    #40062975
scorpion235
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7m,

Да, работает с CONTAINING. Никакое экранирование не нужно. Благодарю!


авторLIKE LOWER(''%'|| :P_COMMENT ||'%'')
заменил на
авторCONTAINING LOWER(:P_COMMENT)
...
Рейтинг: 0 / 0
Экранирование в динамическом sql
    #40062976
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scorpion235,

LOWER тоже убери, CONTAINING ищет без учёта регистра.
...
Рейтинг: 0 / 0
Экранирование в динамическом sql
    #40063053
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, еще можно было '%' присоединить к значению параметра:

Код: sql
1.
2.
3.
  AND LOWER( COMMENT ) LIKE LOWER( :P_COMMENT )'

    ( P_COMMENT := '%' || :P_COMMENT || '%',
...
Рейтинг: 0 / 0
Экранирование в динамическом sql
    #40063114
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,

А если параметр используется ещё где-то, то нельзя.
...
Рейтинг: 0 / 0
Экранирование в динамическом sql
    #40063141
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery
А если параметр используется ещё где-то, то нельзя.

Это да. По любому, надо смотреть в каждом конкретном случае.
...
Рейтинг: 0 / 0
Экранирование в динамическом sql
    #40063532
scorpion235
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery,
единственное, при поиске через LIKE можно было в середине текста поиска добавить % (поиск: текст%текст),
здесь %воспринимается как любое количество любых символов
если использовать CONTAINING, то % уже воспринимается просто как символом в строке
...
Рейтинг: 0 / 0
Экранирование в динамическом sql
    #40063715
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scorpion235,

Если речь о возможностях, то открой для себя регулярные выражения
...
Рейтинг: 0 / 0
Экранирование в динамическом sql
    #40063723
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scorpion235,

а README.alternate_string_quoting.txt ты смотрел? Как по мне это самый удобный способ, который позволяет без труда внутри строки вставить текстовый литерал.
И ещё не к чему делать конкатенацию там где она не требуется.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  
...
sql_text = q'!
SELECT ID,
 BDATE,
 EDATE,
 COMMENT
FROM ERRANDS
WHERE ((PKB_UTILS.ISNULL(:P_COMMENT)) OR (NOT PKB_UTILS.ISNULL(:P_COMMENT) AND LOWER(COMMENT) LIKE LOWER('%'|| :P_COMMENT ||'%')))
 AND BDATE >= :P_BDATE AND EDATE <= :P_EDATE
!';
...
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Экранирование в динамическом sql
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]