Переписывание операторов SQL в подготовленные операторы в Java - PullRequest
0 голосов
/ 28 ноября 2011

Ввиду обстоятельств, не зависящих от нас (другими словами, с помощью кода, написанного сторонней организацией), нам необходимо переписать операторы SQL со встроенными значениями в подготовленные операторы.Прямо сейчас мы используем ужасный набор регулярных выражений, которые улавливают большинство случаев, но все еще терпят неудачу в некоторых (и вообще ужасно терпят неудачу, производя неправильный SQL).

Похоже, нам нужнона самом деле разбираем SQL, подставляя "?"параметры для явных строковых и числовых значений и сбор значений для внедрения в новый подготовленный оператор.

  1. Кто-нибудь уже сделал это?
  2. Если вы этого не сделали, но использовали один из анализаторов Java SQL, вы бы порекомендовали этот анализатор для этой цели?

Вот пример типа «хайер» SQL, с которым мы имеем дело и который хотел бы переписать:

rewrite from
SELECT COL1 FROM TB1 WHERE LOWER(COL2) = LOWER('foo bar ' || '&' || ' Abc(' || '''' || ')') 
    AND COL3 = 2 AND COL4 = 1
to
SELECT COL1 FROM TB1 WHERE LOWER(COL2) = LOWER(? || ? || ? || ? || ?) 
    AND COL3 = ? AND COL4 = ?
applied to ("foo bar ", "&", " Abc(", "'", ")", 2, 1)

1 Ответ

0 голосов
/ 28 ноября 2011

1) Вы можете создать временную таблицу (время сеанса, основание памяти - по вашему желанию) для заполнения значениями (в нижнем регистре для повышения производительности), которые вам нужны.

И измените свой запрос на:

SELECT  t1.COL1 
FROM    TB1 t1 
        INNER JOIN TEMP_TABLE t2 ON ( t2.val = LOWER(t1.COL2) )
WHERE   t1.COL3 = ? AND t1.COL4 = ?

2) Если вы используете MySQL и искомые значения не содержат запятую, вы можете использовать функцию «find_in_set»:

SELECT  COL1 
FROM    TB1 t1 
WHERE   FIND_IN_SET( LOWER(t1.COL2), ? )
        AND t1.COL3 = ? AND t1.COL4 = ?

applied to ("foo bar,&,Abc(,',)",2,1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...