動機
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 でマクロを実行する。
おわりに
以前の投稿、本が今回のきっかけとなりました!
そして、次のページが参考になりました。ありがとうございます!
手作業で行うと、ほぼ間違いなくどこかで間違えますし、完成したところで大きな成果でもございません。。。
そんな作業が自動化できますと、とてもうれしいですわ♪
以上です。