{"Entry":{"collection":"sql","key":"drop-procedure","name":"DROP PROCEDURE","aliases":["dropprocedure"],"metadata":{"aliases":["dropprocedure"],"changed_in":[],"changes":[{"from":"10","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":[],"removed":[]},"status":"added","synopsis":null,"to":"11"},{"from":"11","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters"],"removed":[]},"status":"changed","synopsis":null,"to":"12"},{"from":"13","purpose_changed":false,"renamed":null,"sections":{"added":["notes"],"changed":["description","parameters","examples","compatibility"],"removed":[]},"status":"changed","synopsis":null,"to":"14"},{"from":"16","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters"],"removed":[]},"status":"changed","synopsis":null,"to":"17"},{"from":"18","purpose_changed":false,"renamed":null,"sections":{"added":[],"changed":["parameters"],"removed":[]},"status":"changed","synopsis":null,"to":"19"}],"content_hash":"18519da2f733512667db684ec9a30c75b533f3c02ae0fcc920b7b4c1c8506e3f","editorial":{},"first_version":"11","group":"routine","imported_at":"2026-09-30T17:43:37.301731+08:00","last_version":"20","name":"DROP PROCEDURE","object":"PROCEDURE","position":2013,"present_in":["11","12","13","14","15","16","17","18","19","20"],"purpose":"remove a procedure","purpose_zh":"","related":["create-procedure","alter-procedure","drop-function","drop-routine"],"slug":"drop-procedure","source_rev":"a709ab85","synopsis":"DROP PROCEDURE [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] [, ...]\n[ CASCADE | RESTRICT ]","verb":"DROP"}},"Definition":{"Collection":"sql","Key":"drop-procedure","SourceDatabase":"center","Version":"18","SourceTable":"sqlcmd","SourceKey":"drop-procedure","SourceRevision":"a709ab85","Facts":{"anchor":"SQL-DROPPROCEDURE","file":"sql-dropprocedure.html","lang":"en","name":"DROP PROCEDURE","purpose":"remove a procedure","purpose_zh":"","related":["create-procedure","alter-procedure","drop-function","drop-routine"],"sections":[{"html":"\u003cp\u003e\u003ccode class=\"command\"\u003eDROP PROCEDURE\u003c/code\u003e removes the definition of one or more existing procedures. To execute this command the user must be the owner of the procedure(s). The argument types to the procedure(s) usually must be specified, since several different procedures can exist with the same name and different argument lists.\u003c/p\u003e","key":"description","title":"Description"},{"html":"\u003cdiv class=\"variablelist\"\u003e\u003cdl class=\"variablelist\"\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eIF EXISTS\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eDo not throw an error if the procedure does not exist. A notice is issued in this case.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eThe name (optionally schema-qualified) of an existing procedure.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eargmode\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eThe mode of an argument: \u003ccode class=\"literal\"\u003eIN\u003c/code\u003e, \u003ccode class=\"literal\"\u003eOUT\u003c/code\u003e, \u003ccode class=\"literal\"\u003eINOUT\u003c/code\u003e, or \u003ccode class=\"literal\"\u003eVARIADIC\u003c/code\u003e. If omitted, the default is \u003ccode class=\"literal\"\u003eIN\u003c/code\u003e (but see below).\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eargname\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eThe name of an argument. Note that \u003ccode class=\"command\"\u003eDROP PROCEDURE\u003c/code\u003e does not actually pay any attention to argument names, since only the argument data types are used to determine the procedure's identity.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eargtype\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eThe data type(s) of the procedure's arguments (optionally schema-qualified), if any. See below for details.\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eCASCADE\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eAutomatically drop objects that depend on the procedure, and in turn all objects that depend on those objects (see \u003ca href=\"/docs/18/ddl-depend.html\" title=\"5.15. Dependency Tracking\"\u003eSection 5.15\u003c/a\u003e).\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eRESTRICT\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003eRefuse to drop the procedure if any objects depend on it. This is the default.\u003c/p\u003e\u003c/dd\u003e\u003c/dl\u003e\u003c/div\u003e","key":"parameters","title":"Parameters"},{"html":"\u003cp\u003eIf there is only one procedure of the given name, the argument list can be omitted. Omit the parentheses too in this case.\u003c/p\u003e\u003cp\u003eIn \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e, it's sufficient to list the input (including \u003ccode class=\"literal\"\u003eINOUT\u003c/code\u003e) arguments, because no two routines of the same name are allowed to share the same input-argument list. Moreover, the \u003ccode class=\"command\"\u003eDROP\u003c/code\u003e command will not actually check that you wrote the types of \u003ccode class=\"literal\"\u003eOUT\u003c/code\u003e arguments correctly; so any arguments that are explicitly marked \u003ccode class=\"literal\"\u003eOUT\u003c/code\u003e are just noise. But writing them is recommendable for consistency with the corresponding \u003ccode class=\"command\"\u003eCREATE\u003c/code\u003e command.\u003c/p\u003e\u003cp\u003eFor compatibility with the SQL standard, it is also allowed to write all the argument data types (including those of \u003ccode class=\"literal\"\u003eOUT\u003c/code\u003e arguments) without any \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargmode\u003c/code\u003e\u003c/em\u003e markers. When this is done, the types of the procedure's \u003ccode class=\"literal\"\u003eOUT\u003c/code\u003e argument(s) \u003cspan class=\"emphasis\"\u003e\u003cem\u003ewill\u003c/em\u003e\u003c/span\u003e be verified against the command. This provision creates an ambiguity, in that when the argument list contains no \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargmode\u003c/code\u003e\u003c/em\u003e markers, it's unclear which rule is intended. The \u003ccode class=\"command\"\u003eDROP\u003c/code\u003e command will attempt the lookup both ways, and will throw an error if two different procedures are found. To avoid the risk of such ambiguity, it's recommendable to write \u003ccode class=\"literal\"\u003eIN\u003c/code\u003e markers explicitly rather than letting them be defaulted, thus forcing the traditional \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e interpretation to be used.\u003c/p\u003e\u003cp\u003eThe lookup rules just explained are also used by other commands that act on existing procedures, such as \u003ccode class=\"command\"\u003eALTER PROCEDURE\u003c/code\u003e and \u003ccode class=\"command\"\u003eCOMMENT ON PROCEDURE\u003c/code\u003e.\u003c/p\u003e","key":"notes","title":"Notes"},{"html":"\u003cp\u003eIf there is only one procedure \u003ccode class=\"literal\"\u003edo_db_maintenance\u003c/code\u003e, this command is sufficient to drop it:\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eDROP PROCEDURE do_db_maintenance;\n\u003c/pre\u003e\u003cp\u003eGiven this procedure definition:\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eCREATE PROCEDURE do_db_maintenance(IN target_schema text, OUT results text) ...\n\u003c/pre\u003e\u003cp\u003eany one of these commands would work to drop it:\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eDROP PROCEDURE do_db_maintenance(IN target_schema text, OUT results text);\nDROP PROCEDURE do_db_maintenance(IN text, OUT text);\nDROP PROCEDURE do_db_maintenance(IN text);\nDROP PROCEDURE do_db_maintenance(text);\nDROP PROCEDURE do_db_maintenance(text, text);  -- potentially ambiguous\n\u003c/pre\u003e\u003cp\u003eHowever, the last example would be ambiguous if there is also, say,\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eCREATE PROCEDURE do_db_maintenance(IN target_schema text, IN options text) ...\n\u003c/pre\u003e","key":"examples","title":"Examples"},{"html":"\u003cp\u003eThis command conforms to the SQL standard, with these \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e extensions:\u003c/p\u003e\u003cdiv class=\"itemizedlist\"\u003e\u003cul class=\"itemizedlist\"\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003eThe standard only allows one procedure to be dropped per command.\u003c/p\u003e\u003c/li\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003eThe \u003ccode class=\"literal\"\u003eIF EXISTS\u003c/code\u003e option is an extension.\u003c/p\u003e\u003c/li\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003eThe ability to specify argument modes and names is an extension, and the lookup rules differ when modes are given.\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e","key":"compatibility","title":"Compatibility"},{"html":"\u003cspan class=\"simplelist\"\u003e\u003ca href=\"/wiki/sql/create-procedure/?v=18\" title=\"CREATE PROCEDURE\"\u003e\u003cspan class=\"refentrytitle\"\u003eCREATE PROCEDURE\u003c/span\u003e\u003c/a\u003e, \u003ca href=\"/wiki/sql/alter-procedure/?v=18\" title=\"ALTER PROCEDURE\"\u003e\u003cspan class=\"refentrytitle\"\u003eALTER PROCEDURE\u003c/span\u003e\u003c/a\u003e, \u003ca href=\"/wiki/sql/drop-function/?v=18\" title=\"DROP FUNCTION\"\u003e\u003cspan class=\"refentrytitle\"\u003eDROP FUNCTION\u003c/span\u003e\u003c/a\u003e, \u003ca href=\"/wiki/sql/drop-routine/?v=18\" title=\"DROP ROUTINE\"\u003e\u003cspan class=\"refentrytitle\"\u003eDROP ROUTINE\u003c/span\u003e\u003c/a\u003e\u003c/span\u003e","key":"see_also","title":"See Also"}],"sections_same_as":"","slug":"18","synopsis_html":"DROP PROCEDURE [ IF EXISTS ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/em\u003e [ ( [ [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargmode\u003c/code\u003e\u003c/em\u003e ] [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargname\u003c/code\u003e\u003c/em\u003e ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargtype\u003c/code\u003e\u003c/em\u003e [, ...] ] ) ] [, ...]\n    [ CASCADE | RESTRICT ]","synopsis_text":"DROP PROCEDURE [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] [, ...]\n[ CASCADE | RESTRICT ]"},"ManualEvidence":{},"MeasuredEvidence":{}},"Text":{"Collection":"sql","Key":"drop-procedure","SourceDatabase":"pgweb","Version":"18","Locale":"zh-Hans","Title":"DROP PROCEDURE","Summary":"移除一个过程","BodyHTML":"\u003cpre\u003eDROP PROCEDURE [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] [, ...]\n[ CASCADE | RESTRICT ]\u003c/pre\u003e\u003csection\u003e\u003ch2\u003e描述\u003c/h2\u003e\u003cp\u003e\u003ccode\u003eDROP PROCEDURE\u003c/code\u003e移除一个或多个现有过程的定义。要执行此命令，用户必须是这些过程的拥有者。通常必须指定过程的参数类型，因为可能存在多个同名但参数列表不同的过程。\u003c/p\u003e\u003c/section\u003e\u003csection\u003e\u003ch2\u003e参数\u003c/h2\u003e\u003cdiv\u003e\u003cdl\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eIF EXISTS\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e如果该过程不存在，则不要抛出错误。这种情况下会发出一个提示。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003cem\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e现有过程的名称（可带模式限定）。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003cem\u003e\u003ccode\u003eargmode\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e参数的模式：\u003ccode\u003eIN\u003c/code\u003e、\u003ccode\u003eOUT\u003c/code\u003e、\u003ccode\u003eINOUT\u003c/code\u003e或\u003ccode\u003eVARIADIC\u003c/code\u003e。如果省略，默认为\u003ccode\u003eIN\u003c/code\u003e（但见下文）。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003cem\u003e\u003ccode\u003eargname\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e参数名称。注意，\u003ccode\u003eDROP PROCEDURE\u003c/code\u003e 实际上并不关心参数名，因为确定过程标识时只使用参数数据类型。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003cem\u003e\u003ccode\u003eargtype\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e过程参数的数据类型（如果有，可带模式限定）。详见下文。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eCASCADE\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e自动删除依赖于该过程的对象，以及进一步依赖于这些对象的所有对象（参见\u003ca href=\"/docs/18/ddl-depend.html\" rel=\"nofollow\"\u003e第 5.15 节\u003c/a\u003e）。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan\u003e\u003ccode\u003eRESTRICT\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e如果有任何对象依赖于该过程，则拒绝删除它。这是默认值。\u003c/p\u003e\u003c/dd\u003e\u003c/dl\u003e\u003c/div\u003e\u003c/section\u003e\u003csection\u003e\u003ch2\u003e注解\u003c/h2\u003e\u003cp\u003e如果给定名称的过程只有一个，则可以省略参数列表。这种情况下连括号也要省略。\u003c/p\u003e\u003cp\u003e在\u003cspan\u003ePostgreSQL\u003c/span\u003e中，只列出输入参数（包括\u003ccode\u003eINOUT\u003c/code\u003e）就足够了，因为不允许两个同名例程具有相同的输入参数列表。此外，\u003ccode\u003eDROP\u003c/code\u003e命令实际上不会检查所写的 \u003ccode\u003eOUT\u003c/code\u003e参数类型是否正确，因此任何显式标记为 \u003ccode\u003eOUT\u003c/code\u003e的参数都只是多余信息。不过，为了与相应的 \u003ccode\u003eCREATE\u003c/code\u003e命令保持一致，仍然建议写上它们。\u003c/p\u003e\u003cp\u003e为了与 SQL 标准兼容，也允许在不写任何 \u003cem\u003e\u003ccode\u003eargmode\u003c/code\u003e\u003c/em\u003e标记的情况下，直接写出全部参数数据类型（包括\u003ccode\u003eOUT\u003c/code\u003e参数的类型）。这样做时，\u003cspan\u003e\u003cem\u003e会\u003c/em\u003e\u003c/span\u003e核对过程的 \u003ccode\u003eOUT\u003c/code\u003e参数类型是否与该命令一致。这一规定会带来歧义：当参数列表中不包含 \u003cem\u003e\u003ccode\u003eargmode\u003c/code\u003e\u003c/em\u003e标记时，就不清楚意图采用哪条规则。\u003ccode\u003eDROP\u003c/code\u003e命令会按两种方式进行查找；如果找到两个不同的过程，就会抛出错误。为了避免这种歧义风险，建议显式写出\u003ccode\u003eIN\u003c/code\u003e标记，而不是依赖默认值，从而强制采用传统的 \u003cspan\u003ePostgreSQL\u003c/span\u003e解释。\u003c/p\u003e\u003cp\u003e上面解释的这些查找规则也被其他作用于现有过程的命令使用，例如 \u003ccode\u003eALTER PROCEDURE\u003c/code\u003e和\u003ccode\u003eCOMMENT ON PROCEDURE\u003c/code\u003e。\u003c/p\u003e\u003c/section\u003e\u003csection\u003e\u003ch2\u003e示例\u003c/h2\u003e\u003cp\u003e如果只有一个过程\u003ccode\u003edo_db_maintenance\u003c/code\u003e，则以下命令即可删除它：\u003c/p\u003e\u003cpre\u003eDROP PROCEDURE do_db_maintenance;\n\u003c/pre\u003e\u003cp\u003e给定如下过程定义：\u003c/p\u003e\u003cpre\u003eCREATE PROCEDURE do_db_maintenance(IN target_schema text, OUT results text) ...\n\u003c/pre\u003e\u003cp\u003e以下任意一条命令都可以删除它：\u003c/p\u003e\u003cpre\u003eDROP PROCEDURE do_db_maintenance(IN target_schema text, OUT results text);\nDROP PROCEDURE do_db_maintenance(IN text, OUT text);\nDROP PROCEDURE do_db_maintenance(IN text);\nDROP PROCEDURE do_db_maintenance(text);\nDROP PROCEDURE do_db_maintenance(text, text);  -- 可能有歧义\n\u003c/pre\u003e\u003cp\u003e不过，如果还存在例如这样的过程，那么最后一个例子就会有歧义：\u003c/p\u003e\u003cpre\u003eCREATE PROCEDURE do_db_maintenance(IN target_schema text, IN options text) ...\n\u003c/pre\u003e\u003c/section\u003e\u003csection\u003e\u003ch2\u003e兼容性\u003c/h2\u003e\u003cp\u003e此命令符合 SQL 标准，但有以下\u003cspan\u003ePostgreSQL\u003c/span\u003e扩展：\u003c/p\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cp\u003e标准每条命令只允许删除一个过程。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e\u003ccode\u003eIF EXISTS\u003c/code\u003e选项是扩展。\u003c/p\u003e\u003c/li\u003e\u003cli\u003e\u003cp\u003e允许指定参数模式和参数名是扩展，而且在给出模式时查找规则也有所不同。\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003c/section\u003e\u003csection\u003e\u003ch2\u003e另见\u003c/h2\u003e\u003cspan\u003e\u003ca href=\"/wiki/sql/create-procedure/?v=18\" title=\"CREATE PROCEDURE\" rel=\"nofollow\"\u003e\u003cspan\u003eCREATE PROCEDURE\u003c/span\u003e\u003c/a\u003e, \u003ca href=\"/wiki/sql/alter-procedure/?v=18\" title=\"ALTER PROCEDURE\" rel=\"nofollow\"\u003e\u003cspan\u003eALTER PROCEDURE\u003c/span\u003e\u003c/a\u003e, \u003ca href=\"/wiki/sql/drop-function/?v=18\" title=\"DROP FUNCTION\" rel=\"nofollow\"\u003e\u003cspan\u003eDROP FUNCTION\u003c/span\u003e\u003c/a\u003e, \u003ca href=\"/wiki/sql/drop-routine/?v=18\" title=\"DROP ROUTINE\" rel=\"nofollow\"\u003e\u003cspan\u003eDROP ROUTINE\u003c/span\u003e\u003c/a\u003e\u003c/span\u003e\u003c/section\u003e","SourceRevision":"1b5ca64c","ContentHash":"df5fbf5a9b366f1042dd710522cfe9617fdd65906475f19c8602fbdc9307c93c","Payload":{"purpose_zh":"移除一个过程","sections":[{"html":"\u003cp\u003e\u003ccode class=\"command\"\u003eDROP PROCEDURE\u003c/code\u003e移除一个或多个现有过程的定义。要执行此命令，用户必须是这些过程的拥有者。通常必须指定过程的参数类型，因为可能存在多个同名但参数列表不同的过程。\u003c/p\u003e","key":"description","title":"描述"},{"html":"\u003cdiv class=\"variablelist\"\u003e\u003cdl class=\"variablelist\"\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eIF EXISTS\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e如果该过程不存在，则不要抛出错误。这种情况下会发出一个提示。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e现有过程的名称（可带模式限定）。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eargmode\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e参数的模式：\u003ccode class=\"literal\"\u003eIN\u003c/code\u003e、\u003ccode class=\"literal\"\u003eOUT\u003c/code\u003e、\u003ccode class=\"literal\"\u003eINOUT\u003c/code\u003e或\u003ccode class=\"literal\"\u003eVARIADIC\u003c/code\u003e。如果省略，默认为\u003ccode class=\"literal\"\u003eIN\u003c/code\u003e（但见下文）。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eargname\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e参数名称。注意，\u003ccode class=\"command\"\u003eDROP PROCEDURE\u003c/code\u003e 实际上并不关心参数名，因为确定过程标识时只使用参数数据类型。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003cem class=\"replaceable\"\u003e\u003ccode\u003eargtype\u003c/code\u003e\u003c/em\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e过程参数的数据类型（如果有，可带模式限定）。详见下文。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eCASCADE\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e自动删除依赖于该过程的对象，以及进一步依赖于这些对象的所有对象（参见\u003ca href=\"/docs/18/ddl-depend.html\" title=\"5.15. 依赖跟踪\"\u003e第 5.15 节\u003c/a\u003e）。\u003c/p\u003e\u003c/dd\u003e\u003cdt\u003e\u003cspan class=\"term\"\u003e\u003ccode class=\"literal\"\u003eRESTRICT\u003c/code\u003e\u003c/span\u003e\u003c/dt\u003e\u003cdd\u003e\u003cp\u003e如果有任何对象依赖于该过程，则拒绝删除它。这是默认值。\u003c/p\u003e\u003c/dd\u003e\u003c/dl\u003e\u003c/div\u003e","key":"parameters","title":"参数"},{"html":"\u003cp\u003e如果给定名称的过程只有一个，则可以省略参数列表。这种情况下连括号也要省略。\u003c/p\u003e\u003cp\u003e在\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e中，只列出输入参数（包括\u003ccode class=\"literal\"\u003eINOUT\u003c/code\u003e）就足够了，因为不允许两个同名例程具有相同的输入参数列表。此外，\u003ccode class=\"command\"\u003eDROP\u003c/code\u003e命令实际上不会检查所写的 \u003ccode class=\"literal\"\u003eOUT\u003c/code\u003e参数类型是否正确，因此任何显式标记为 \u003ccode class=\"literal\"\u003eOUT\u003c/code\u003e的参数都只是多余信息。不过，为了与相应的 \u003ccode class=\"command\"\u003eCREATE\u003c/code\u003e命令保持一致，仍然建议写上它们。\u003c/p\u003e\u003cp\u003e为了与 SQL 标准兼容，也允许在不写任何 \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargmode\u003c/code\u003e\u003c/em\u003e标记的情况下，直接写出全部参数数据类型（包括\u003ccode class=\"literal\"\u003eOUT\u003c/code\u003e参数的类型）。这样做时，\u003cspan class=\"emphasis\"\u003e\u003cem\u003e会\u003c/em\u003e\u003c/span\u003e核对过程的 \u003ccode class=\"literal\"\u003eOUT\u003c/code\u003e参数类型是否与该命令一致。这一规定会带来歧义：当参数列表中不包含 \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargmode\u003c/code\u003e\u003c/em\u003e标记时，就不清楚意图采用哪条规则。\u003ccode class=\"command\"\u003eDROP\u003c/code\u003e命令会按两种方式进行查找；如果找到两个不同的过程，就会抛出错误。为了避免这种歧义风险，建议显式写出\u003ccode class=\"literal\"\u003eIN\u003c/code\u003e标记，而不是依赖默认值，从而强制采用传统的 \u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e解释。\u003c/p\u003e\u003cp\u003e上面解释的这些查找规则也被其他作用于现有过程的命令使用，例如 \u003ccode class=\"command\"\u003eALTER PROCEDURE\u003c/code\u003e和\u003ccode class=\"command\"\u003eCOMMENT ON PROCEDURE\u003c/code\u003e。\u003c/p\u003e","key":"notes","title":"注解"},{"html":"\u003cp\u003e如果只有一个过程\u003ccode class=\"literal\"\u003edo_db_maintenance\u003c/code\u003e，则以下命令即可删除它：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eDROP PROCEDURE do_db_maintenance;\n\u003c/pre\u003e\u003cp\u003e给定如下过程定义：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eCREATE PROCEDURE do_db_maintenance(IN target_schema text, OUT results text) ...\n\u003c/pre\u003e\u003cp\u003e以下任意一条命令都可以删除它：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eDROP PROCEDURE do_db_maintenance(IN target_schema text, OUT results text);\nDROP PROCEDURE do_db_maintenance(IN text, OUT text);\nDROP PROCEDURE do_db_maintenance(IN text);\nDROP PROCEDURE do_db_maintenance(text);\nDROP PROCEDURE do_db_maintenance(text, text);  -- 可能有歧义\n\u003c/pre\u003e\u003cp\u003e不过，如果还存在例如这样的过程，那么最后一个例子就会有歧义：\u003c/p\u003e\u003cpre class=\"programlisting\"\u003eCREATE PROCEDURE do_db_maintenance(IN target_schema text, IN options text) ...\n\u003c/pre\u003e","key":"examples","title":"示例"},{"html":"\u003cp\u003e此命令符合 SQL 标准，但有以下\u003cspan class=\"productname\"\u003ePostgreSQL\u003c/span\u003e扩展：\u003c/p\u003e\u003cdiv class=\"itemizedlist\"\u003e\u003cul class=\"itemizedlist\"\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003e标准每条命令只允许删除一个过程。\u003c/p\u003e\u003c/li\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003e\u003ccode class=\"literal\"\u003eIF EXISTS\u003c/code\u003e选项是扩展。\u003c/p\u003e\u003c/li\u003e\u003cli class=\"listitem\"\u003e\u003cp\u003e允许指定参数模式和参数名是扩展，而且在给出模式时查找规则也有所不同。\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e","key":"compatibility","title":"兼容性"},{"html":"\u003cspan class=\"simplelist\"\u003e\u003ca href=\"/wiki/sql/create-procedure/?v=18\" title=\"CREATE PROCEDURE\"\u003e\u003cspan class=\"refentrytitle\"\u003eCREATE PROCEDURE\u003c/span\u003e\u003c/a\u003e, \u003ca href=\"/wiki/sql/alter-procedure/?v=18\" title=\"ALTER PROCEDURE\"\u003e\u003cspan class=\"refentrytitle\"\u003eALTER PROCEDURE\u003c/span\u003e\u003c/a\u003e, \u003ca href=\"/wiki/sql/drop-function/?v=18\" title=\"DROP FUNCTION\"\u003e\u003cspan class=\"refentrytitle\"\u003eDROP FUNCTION\u003c/span\u003e\u003c/a\u003e, \u003ca href=\"/wiki/sql/drop-routine/?v=18\" title=\"DROP ROUTINE\"\u003e\u003cspan class=\"refentrytitle\"\u003eDROP ROUTINE\u003c/span\u003e\u003c/a\u003e\u003c/span\u003e","key":"see_also","title":"另见"}],"sections_same_as":"","synopsis_html":"DROP PROCEDURE [ IF EXISTS ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/em\u003e [ ( [ [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargmode\u003c/code\u003e\u003c/em\u003e ] [ \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargname\u003c/code\u003e\u003c/em\u003e ] \u003cem class=\"replaceable\"\u003e\u003ccode\u003eargtype\u003c/code\u003e\u003c/em\u003e [, ...] ] ) ] [, ...]\n    [ CASCADE | RESTRICT ]","synopsis_text":"DROP PROCEDURE [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] [, ...]\n[ CASCADE | RESTRICT ]"}},"RequestedLocale":"zh-Hans","Fallback":false,"Versions":["11","12","13","14","15","16","17","18","19","20"],"Locales":["en","zh-Hans"],"Signatures":null,"Spellings":null,"SQLState":null,"Evidence":null}
