これが私の使用例です。入力は、任意の複雑さのOracle PL/SQL ステートメントを表す文字列です。これは (スクリプトではなく) 単一のステートメントであると想定できます。ここで、この入力文字列のいくつかのビットを書き換える必要があります。
たとえば、テーブル名にはプレフィックスを付ける必要があり、列エイリアスを使用しない選択リスト内の集計関数にはデフォルトのエイリアスを割り当てる必要があります。
SELECT SUM(ABS(x.value)),
TO_CHAR(y.ID,'111,111'),
y.some_col
FROM
tableX x,
(SELECT DISTINCT ID
FROM tableZ z
WHERE ID > 10) y
WHERE
...
になる
SELECT SUM(ABS(x.value)) COL1,
TO_CHAR(y.ID,'111,111') COL2,
y.some_col
FROM
pref.tableX x,
(SELECT DISTINCT ID, some_col
FROM pref.tableZ z
WHERE ID > 10) y
WHERE
...
(免責事項:問題を説明するためだけに、ステートメントは意味をなさない)
集約関数はネストされている可能性があり、subSELECT は b_tch であるため、正規表現はあえて使用しません。実際、私は 80% の成功を達成しましたが、残りの 20% が必要です。
正しいアプローチは、文法とパーサーを使用することだと思います。私はc ++ ANTLR2をいじりました(ただし、文法やそのような助けを借りた解析についてはあまり知りません)。SQL ビットを取得する簡単な方法がわかりません。
list<string> *ssel = theAST.getSubSelectList(); // fantasy land
「解析の専門家」がこの問題をどのように追求するかについて、誰かがいくつかの指針を提供できますか? 編集:私はOracle 9iを使用しています。