DROP PROCEDURE — プロシージャを削除する
DROP PROCEDURE [ IF EXISTS ]name
[ ( [ [argmode
] [argname
]argtype
[, ...] ] ) ] [, ...] [ CASCADE | RESTRICT ]
DROP PROCEDURE
は1つ以上の既存のプロシージャ定義を削除します。
このコマンドを実行できるのは、そのプロシージャの所有者のみです。
プロシージャの引数の型は通常必ず指定しなければなりません。
異なる引数を持つ同じ名前のプロシージャが複数存在する可能性があるからです。
IF EXISTS
プロシージャが存在しない場合でもエラーになりません。 この場合注意(NOTICE)メッセージが発行されます。
name
既存の関数の名前です(スキーマ修飾名も可)。
argmode
引数モードで、IN
かOUT
かINOUT
かVARIADIC
のいずれかです。
省略した場合のデフォルトはIN
です(ただし、以下を参照)。
argname
引数の名前です。
プロシージャの識別を行うには引数のデータ型のみが使用されますので、実際にはDROP PROCEDURE
は引数の名前を無視することに注意してください。
argtype
もしあれば、そのプロシージャの引数のデータ型(スキーマ修飾可能)です。 詳細は以下を参照してください。
CASCADE
プロシージャに依存するオブジェクトを自動的に削除し、さらにそれらのオブジェクトに依存するすべてのオブジェクトも削除します(5.14参照)。
RESTRICT
依存しているオブジェクトがある場合、そのプロシージャの削除を拒否します。 これがデフォルトです。
指定した名前のプロシージャが1つしかない場合は、引数リストを省略できます。 この場合は括弧も省略してください。
PostgreSQLでは、入力引数(INOUT
を含む)を列挙すれば十分です。
これは同じ名前のルーチンが同じ入力引数リストを共有することは許可されていないためです。
さらにDROP
コマンドはOUT
引数の型を正しく書いたかどうかを実際にはチェックしません。
したがって、明示的にOUT
と記された引数は単なるノイズにすぎません。
しかし、対応するCREATE
コマンドとの一貫性を保つために、これらを書いておくことをお勧めします。
SQL標準との互換性のため、argmode
印を付けずに、すべての引数のデータ型(OUT
引数のデータ型を含む)を書くこともできます。
これが行なわれると、プロシージャのOUT
引数の型はコマンドに対して検証されるようになるでしょう。
この規定は、引数リストにargmode
印が含まれていない場合、どの規則を意図しているのかが不明確であるという曖昧さを生じさせます。
DROP
コマンドは両方の方法で検索を試み、2つの異なるプロシージャが見つかった場合エラーを生じます。
このような曖昧さのリスクを避けるために、IN
印をデフォルトにするのではなく明示的に記述して、従来のPostgreSQL解釈を強制的に使用することをお勧めします。
ここで説明した検索規則は、ALTER PROCEDURE
やCOMMENT ON PROCEDURE
など、既存のプロシージャーに作用する他のコマンドでも使用されます。
do_db_maintenance
プロシージャが1つしかない場合、次のコマンドで削除できます。
DROP PROCEDURE do_db_maintenance;
下記のプロシージャ定義が与えられた時、
CREATE PROCEDURE do_db_maintenance(IN target_schema text, OUT results text) ...
下記のコマンドのいずれかを使用すれば、プロシージャを削除することができます。
DROP PROCEDURE do_db_maintenance(IN target_schema text, OUT results text); DROP PROCEDURE do_db_maintenance(IN text, OUT text); DROP PROCEDURE do_db_maintenance(IN text); DROP PROCEDURE do_db_maintenance(text); DROP PROCEDURE do_db_maintenance(text, text); -- potentially ambiguous
しかし、最後の例は、例えば下記もあると曖昧になります。
CREATE PROCEDURE do_db_maintenance(IN target_schema text, IN options text) ...
このコマンドはSQL標準に準拠しますが、以下のPostgreSQLの拡張があります。
標準はコマンドごとに一つのプロシージャしか削除できません。
IF EXISTS
オプションは拡張です。
引数モードと引数名を指定できるのは拡張で、モードが指定されている場合は検索規則が異なります。