CREATE PROCEDURE 语句 (PL/SQL)

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

调用

可以从 Db2® 命令行处理器 (CLP) ,任何受支持的交互式 SQL 接口,应用程序或例程执行此语句。

权限

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

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

语法

Read syntax diagramSkip visual syntax diagramCREATEOR REPLACE PROCEDURE(,parameter-nameINOUTIN OUTdata-typedefault-clause)READS SQL DATAISASdeclarationBEGIN statement EXCEPTIONWHENexceptionORexceptionTHENstatementENDprocedure-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 语句。 此子句是 Db2 数据服务器扩展。
IS 或 AS
引入过程体定义。
声明
指定一个或多个变量、游标或 REF CURSOR 类型声明。
BEGIN
引入可执行块。 BEGIN-END 块可以包含 EXCEPTION 节。
语句
指定 PL/SQL 或 SQL 语句。 此语句必须以分号终止。
EXCEPTION
用于引入异常节的可选关键字。
WHEN 异常-条件
指定用于测试一种或多种异常的条件表达式。
语句
指定 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 语句,其标签为标准 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;