-1

このようなマージクエリがあります

MERGE INTO dept a
 USING (
     SELECT  50           deptno
          , 'ENGINEERING' dname
          , 'WEXFORD'     loc
     FROM dual
 ) b
 ON (a.deptno = b.deptno)
 WHEN NOT MATCHED THEN
     INSERT VALUES (b.deptno, b.dname, b.loc)
 WHEN MATCHED THEN
     UPDATE SET a.loc = 'WEXFORD, PA';

次のような出力が必要です。

INSERT VALUES (b.deptno,b.dname,b.loc)
UPDATE SET a.loc='WEXFORD,pA'

これを行うには、別の簡単な方法で部分文字列を使用してこれを達成できますか?

4

1 に答える 1

1

私が理解しているように、クエリの実行について特に気にする必要はありません。クエリ テキストの特定の部分のみを抽出する必要がありますよね? あなたの最善の策は、それらの部分を記述する正規表現を作成し、それらを入力文字列と照合し、見つかった各一致の関連部分を出力することです。

簡単な例は次のとおりです。

import java.util.regex.*;
class Foo {
    private static final Pattern re
      = Pattern.compile("INSERT VALUES \\(.*?\\)|UPDATE SET .*;");
    static void find(String text) {
        Matcher m = re.matcher(text);
        while (m.find())
            System.out.println(m.group());
    }
}

この単純な例では、挿入部分に式に記述されているとおりにスペースが含まれていること、およびその後に括弧で囲まれた引数の単一のリストが続くことを期待しています。更新は、クエリの最後まで継続することが期待されます。正規表現の作成方法については、パターンのドキュメントを参照してください。

括弧、セミコロン、さらには SQL コマンドのように見える単語を含む可能性のある文字列を処理する場合、事態はさらに困難になります。また、ある時点で、ネストされた括弧の任意のレベルを検出する必要がある場合、正規表現を使用してこれを表現することはまったくできません。

于 2012-07-20T07:25:29.817 に答える