他のバージョンの文書 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

DROP PROCEDURE

DROP PROCEDURE — プロシージャを削除する

概要

DROP PROCEDURE [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] [, ...]
    [ CASCADE | RESTRICT ]

説明

DROP PROCEDUREは1つ以上の既存のプロシージャ定義を削除します。 このコマンドを実行できるのは、そのプロシージャの所有者のみです。 プロシージャの引数の型は通常必ず指定しなければなりません。 異なる引数を持つ同じ名前のプロシージャが複数存在する可能性があるからです。

パラメータ

IF EXISTS

プロシージャが存在しない場合でもエラーになりません。 この場合注意(NOTICE)メッセージが発行されます。

name

既存の関数の名前です(スキーマ修飾名も可)。

argmode

引数モードで、INOUTINOUTVARIADICのいずれかです。 省略した場合のデフォルトは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 PROCEDURECOMMENT 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オプションは拡張です。

  • 引数モードと引数名を指定できるのは拡張で、モードが指定されている場合は検索規則が異なります。

関連項目

CREATE PROCEDURE, ALTER PROCEDURE, DROP FUNCTION, DROP ROUTINE