1

私はSQL文を持っています:

uPdate emp set emp_note='I am set to this ' where emp_name='John';

オラクル固有のステートメントを大文字に置き換えたいので、次のようにします。

   +89      $line =~ s/ where / WHERE /ig;
   +90      $line =~ s/ set / SET /g;
   +91      $line =~ s/^select/SELECT/ig;
   +92      $line =~ s/^update/UPDATE/ig;
   +93      $line =~ s/^delete/DELETE/ig;
   +94      $line =~ s/^insert/INSERT/ig;
   +95      $line =~ s/ and / AND /g;
   +96      $line =~ s/ from / FROM /g;
   +97      $line =~ s/ in / IN /g;

上記は、値であるテキストも置き換えます(私はこれに設定されています)。たとえば、上記のステートメントは次のようにレンダリングされます。

UPDATE emp SET emp_note='I am SET to this ' WHERE emp_name='John';

これを回避して、SQL ステートメント内の値ではなくキーワードのみを置換するように perl を設定するにはどうすればよいですか?

問題は、perl で利用可能な SQL パッケージを使用できないことでもあるため、昔ながらの正規表現を使用する必要があります。

4

3 に答える 3

0

キャプチャ グループを使用すると、大文字にする一致の部分を簡単に選択できます。

use strict;
my $query = "uPdate emp set emp_note='I am\' set to this ' where emp_name='John'"; 
$query =~ s/('[^'\\]*(?s:\\.[^'\\]*)*')|\b(update|where|set|select|delete|insert|and|from|in)\b/$1\U$2/gi;
print $query;

最初の分岐は回避したいことを記述し、2 番目の分岐はターゲットです。

于 2013-05-07T13:23:24.307 に答える
-1

SQL ステートメントでリテラル文字列の代わりにホスト変数を使用します。

いずれにせよ、セキュリティ上の考慮事項 (SQL インジェクションの危険性) のためにそれらを使用する必要があります。

すべての適切な API がそれらをサポートしています。そうでない場合、「セキュリティ」トークンにより、管理者はほぼ確実に別のトークンをインストールすることになります... ;-)

于 2013-05-07T13:00:10.677 に答える