CREATE PROCEDURE 语句 (PL/SQL)

CREATE PROCEDURE 语句用于定义存储在数据库中的过程。

调用

可以从 命令行处理器 (CLP)、任何受支持的交互式 SQL 界面、应用程序或例程中执行此语句。

权限

此语句的授权标识所拥有的特权必须至少包括下列其中一项:
  • 如果此过程的模式名不存在:对数据库的 IMPLICIT_SCHEMA 权限
  • 如果此过程的模式名引用现有的模式:对该模式的 CREATEIN 特权
  • DBADM 权限
此语句的授权标识所拥有的特权还必须包括调用过程体中指定的 SQL 语句所需的所有特权。

如果指定了 OR REPLACE,那么此语句的授权标识必须是匹配的过程的所有者 (SQLSTATE 42501)。

语法

阅读语法图跳过直观语法图CREATEOR REPLACE PROCEDURE(,参数名INOUTIN OUT数据类型default-clause)READS SQL DATAISASdeclarationBEGIN 语句 EXCEPTIONWHEN异常OR异常THEN语句ENDprocedure-name

描述

PROCEDURE procedure-name
指定过程的标识。procedure-name 的未限定格式是最大长度为 128 的 SQL 标识。在动态 SQL 语句中,使用 CURRENT SCHEMA 专用寄存器的值对未限定的对象名进行限定。在静态 SQL 语句中,QUALIFIER 预编译或绑定选项隐式地指定未限定的对象名的限定符。procedure-name 的限定格式是后面跟着句点字符和 SQL 标识的模式名。如果指定了两部分的名称,那么模式名不能以“SYS”开头;否则,将返回错误 (SQLSTATE 42939)。

名称(包括隐式或显式的限定符)与参数数目不能标识已在目录中描述的过程 (SQLSTATE 42723)。未限定的名称与参数数目在其模式中唯一,但不必跨模式唯一。

参数名
指定参数的名称。参数名对此过程必须唯一 (SQLSTATE 42734)。
data-type
指定其中一种受支持的 PL/SQL 数据类型。
READS SQL DATA
指示此过程可以包含不修改 SQL 数据的 SQL 语句。此子句是 数据服务器扩展。
IS 或 AS
引入过程体定义。
declaration
指定一个或多个变量、游标或 REF CURSOR 类型声明。
BEGIN
引入可执行块。BEGIN-END 块可以包含 EXCEPTION 节。
statement
指定 PL/SQL 或 SQL 语句。此语句必须以分号终止。
EXCEPTION
用于引入异常节的可选关键字。
WHEN exception-condition
指定用于测试一种或多种异常的条件表达式。
statement
指定 PL/SQL 或 SQL 语句。此语句必须以分号终止。
END
用于结束块的必需关键字。(可选)可以指定过程的名称。

注意

可以采用已模糊化的格式来提交 CREATE PROCEDURE 语句。在已模糊化的语句中,只有过程名可读。按照下面这样一种方式对该语句的其余内容进行编码:这些内容不可读,但是可由数据库服务器解码。可以通过调用 DBMS_DDL.WRAP 函数来生成模糊化的语句。

示例

以下示例演示没有参数的单一过程:
CREATE OR REPLACE PROCEDURE simple_procedure
IS
BEGIN      
   DBMS_OUTPUT.PUT_LINE('That''s all folks!');
END simple_procedure;
以下示例显示一个过程,此过程采用 IN 参数和 OUT 参数,并且具有 GOTO 语句,GOTO 语句的标签为标准 PL/SQL 格式 (<<label>>):
CREATE OR REPLACE PROCEDURE test_goto
( p1 IN INTEGER, out1 OUT VARCHAR2(30) )
IS
BEGIN      
	<<LABEL2ABOVE>>
		IF p1 = 1 THEN
				out1 := out1 || 'one';
				GOTO LABEL1BELOW;
	END IF;      
		if out1 IS NULL THEN
				out1 := out1 || 'two';
				GOTO LABEL2ABOVE;
	END IF;      

		out1 := out1 || 'three';

	<<LABEL1BELOW>>
		out1 := out1 || 'four';

END test_goto;