PostgreSQL は Stored Procedure に相当するものは
関数という形になっている。

テーブルの更新など処理を SELECT文から呼び出すのは
違和感を否めないが仕方がない。
(ど〜せおれはこんなものを使わなきゃいけない
くずエンジニアですよ。)

 で、この関数、Overload させることができる。
・・・っていうより、引数の型の違う同名の関数を
CREATE OR REPLACE FUNCTION を使って定義すると
前のがそのまま残ってしまう。
完全に差し替えたい場合に
呼び出し側を変え忘れてしまっていた場合、
関数が存在しないことより
誤った関数を呼び出してしまうほうが
数段危険だとおもうのだが。。。

 で、関数を削除するには、DROP FUNCTION で
関数名の他に型も指定しなければならない。
・・・関数名だけ指定すれば Overload している
全関数を削除してくれてもいい気もするが
Object指向的に使うことを考えると
そうもいかないか。まぁ仕方がない。
(さっきとは別の意味で。)
MS SQL Server の場合は
Stored Procedure に枝番を付けて
一括で削除になっているが。

で、一々消すのが面倒で、
どんどんごみ関数がたまってきました。
これを一括で削除する方法はないかと検討した。

PostgreSQL のシステムカタログの pg_proc に
関数の一覧がある。
public schema で登録していて OWNER が特定のユーザーの関数から
選択して DROP FUNCTION の SQL文を生成するようにしたい。
ここで、引数のデータ型のリストは proargtypes Field にあるのだが、
これが oid のリストである oidvector という
PostgreSQL のシステム用の型で表されている。
これを Decode しないと型がわからない。
でも、どうやって・・・?

information schema の方でやろうかとも思ったが、
こっちは OWNER の特定方法がよくわからない。
specific_name と pg_proc の列との結びつけ方もわからない。
で、この方法はあきらめた。

システムカタログの pg_type で oidvector を見てみたが、
これもいまいち役に立たない。
う〜ん、どうしたらいいんだ。。。
PSQL の \d で型の情報出せたかな・・・とか見ていて、
\df で関数の引数のリストが Decode された形で
でてくることに気がついた。
で、これはいったいどうやっているんだ・・・って
PostgreSQL のソースを検索することにする。
\df で表示されるときの Field名の「Argument data types」で
PSQL のソースを grepすると・・・describe.c が引っかかった。
該当場所を見ると、SQL文があり、
そのなかで「pg_catalog.oidvectortypes」という内部関数が使われていた。
これこそが求めていたもの!!

ちゅうわけで、MS Access のパススルークエリで
(pgAccess も使えないので ODBC 接続を利用して
MS Access を作業の Frontend に使っている。)
=================
SELECT proname,pg_catalog.oidvectortypes(proargtypes) AS proargtypenames
from pg_proc
where proowner=
(SELECT usesysid FROM pg_user where usename=’XXXX’) ORDER BY proname
=================
としてユーザー定義関数の一覧P_Func_Listを作成し、
これを利用して、Access で
=================
SELECT ’DROP FUNCTION ’ & [proname] & ’(’ & [proargtypenames] & ’);’ AS 式1
FROM P_Func_List
WHERE (((P_Func_List.proname) Not Like ’tg_*’));
=================
として削除したい関数に対する DROP FUNCTION文を作成した。
(前者の SQL は PostgreSQL, 後者のSQLが MS Access (JET)であることに注意。)
この出力をコピペして目的のリストはできあがった。

まぁ、結局、Source is document. ってところか。

でも、僕はこの言葉は好きでない・・・とか
またいろいろ余計なことを考えて鬱状態。
なんでこんな会社にいるんだろ。
はぁ。。。。

コメント