動機
Oracle の PL/SQL に書かれている、動的 SQL を PostgreSQL で動かしたいですの♪
パラメータ値は、:paraA、:paraB、といった形ですわ。
によりますと、パラメータ値は $1、$2 といった形に変換する必要があるそうですの!
したがいまして、:paraA → $1、:paramB → $2 と変換する必要がございます。
1つ2つなら手作業で問題ありませんが、100、200となりますと手作業では行なえませんの><。
今回、Vim のマクロ機能を使いましてこの問題を解決できましたのでノートいたします♪
変換したい対象コード
変換したいのは、INSERT の VALUES 句の次のようにな記述です。
INSERT INT table1 (
... 略 ...
) VALUES (
:paramA,
:paramB,
FUNC_HOGE(:paramC),
:paramC,
:paramD,
:paramE,
:paramF,
:paramG,
:paramH,
:paramI,
:paramJ
)';
作業完成後に得たいコード
INSERT INT table1 (
... 略 ...
) VALUES (
$1,
$2,
FUNC_HOGE($3),
$4,
$5,
$6,
$7,
$8,
$9,
$10,
$11
)';
Vim マクロの作成、手順の概要
- 1つ目を手作業で修正
- マクロ記録で 2 つ目を修正
- マクロ実行で 3 つ目以降全てを修正
Vim マクロを使った作業の詳細
/:で : を検索し、nで次の : へジャンプできるようにする。- :param1 を $1 へ修正する。
- ビジュアルモードで $1 を選択肢、ヤンクする。
- qqnP^Awvedgevgeyq、とマクロを記録する。
マクロの内容は次のとおり。- qq: マクロを q に割り当てて記録開始する。
- n: 次の検索位置に移動する。
- P: カーソルの直前に貼り付ける。
- ^A: 数字を 1 増加する。操作としては、Ctrl + a。
- w: 数字の次の単語の先頭に移動する。
- ved: 単語全体を選択して削除する。
- ge: 前の単語($3 の 3 など)の末尾に戻る。
- vgey: 単語を後ろから前に選択しヤンクする。b を使用して移動すると、FUNC_HOGE( の場合は ( まで戻ってしまい余計な文字をヤンクしてしまうため、ge で : まで戻るようにした。
- q: マクロを終了する。
- 8@q でマクロを実行する。
おわりに
以前の投稿、本が今回のきっかけとなりました!
そして、次のページが参考になりました。ありがとうございます!
手作業で行うと、ほぼ間違いなくどこかで間違えますし、完成したところで大きな成果でもございません。。。
そんな作業が自動化できますと、とてもうれしいですわ♪
以上です。
