CREATE PROCEDURE 语句(概述)
CREATE PROCEDURE语句用于在数据库服务器中注册存储过程。 您可以使用此声明注册以下类型的程序,每种类型都有单独的描述。
您可以创建以下类型的存储过程:
- 原生 SQL 程序
- 过程体完全由SQL语句编写,包括SQL过程语言(SQL PL)语句。 过程定义中包含并指定了过程体以及过程的各种属性。 为本地SQL过程生成一个包。 它包含过程主体,包括控制语句。 有时可能还包括由 Db2 生成的语句。 每次调用该过程时,程序包都会执行一次或多次。
所有使用CREATE PROCEDURE语句创建的SQL程序,如果未指定FENCED或EXTERNAL选项,则为原生SQL程序。 原生SQL程序支持更多功能,通常比外部SQL程序运行得更好,而且不会为其生成相关的C程序。
- 外部存储过程
- 存储过程主体是用 C、C++、 COBOL 或 Java 等编程语言编写的外部程序,可以包含 SQL 语句。 外部存储过程的源代码与过程定义分开,并绑定到一个包中。 外部可执行文件的名称与过程的各种属性一起作为过程定义的一部分指定。 所有程序必须设计为使用 Language Environment 运行。 COBOL 和 C++ 存储过程可以包含面向对象的扩展。 每次调用存储过程时,存储过程中的逻辑都会控制程序包是否执行以及执行多少次。
更多信息,请参阅创建外部存储过程。
参见 CREATE PROCEDURE语句(外部程序 )。
- 外部SQL程序(已弃用)
- 过程体完全由SQL语句编写,包括SQL过程语言(SQL PL)语句。 在程序定义中,除了程序的各个属性外,还指定了程序体。 为外部SQL过程生成一个C程序和相关包。 它包含过程主体,包括控制语句。 有时可能还包括由 Db2 生成的语句。每次调用该过程时,程序包都会执行一次或多次。
原生SQL程序得到更全面的支持,维护起来也更简单,而且通常比外部SQL程序运行得更好,后者已被弃用。
所有程序类型的注意事项
- 车主特权
- 所有者有权调用该过程(EXECUTE权限),并授予他人调用该过程的权限。 请参阅 GRANT语句(函数或过程权限 )。 有关对象所有权的更多信息,请参阅授权、特权、权限、掩码和对象所有权。
- 定义参数
- 该过程的输入参数在括号内以列表形式给出。
一个过程可以没有输入参数。 在这种情况下,可以指定或省略一组空括号,例如:
CREATE PROCEDURE ASSEMBLY_PARTS()或
CREATE PROCEDURE ASSEMBLY_PARTS- 为参数选择数据类型:
当您为存储过程选择参数的数据类型时,请考虑可能会影响参数值的提升规则。 (参见数据类型推广 )。 例如,作为存储过程输入参数之一的常量可能具有与过程所期望的数据类型不同的内置数据类型,更重要的是,可能无法转换为该过程所期望的数据类型。 根据推广规则,建议使用以下数据类型作为参数:
- INTEGER代替SMALLINT
- DOUBLE代替REAL
- VARCHAR代替CHAR
- VARGRAPHIC代替GRAPHIC
- VARBINARY代替BINARY
为了在非 Db2 for z/OS® 平台之间实现功能的可移植性,请不要使用以下数据类型,因为它们在不同平台上的表现可能有所不同:
- Float。 请使用DOUBLE或REAL。
- 数值。 请改用 DECIMAL。
- 指定参数的编码方案
- 所有参数的编码方案(包括输入和输出参数)必须具有相同的字符或图形字符串数据类型——要么全部为ASCII字符,要么全部为EBCDIC字符,要么全部为UNICODE字符。 如果您在单个参数上指定编码方案,而不是使用参数CCSID一次为所有参数指定编码方案,或者让编码方案默认为系统值,请确保它们都一致。
- 指定参数为AS LOCATOR
- 传递定位符而不是值可以减少程序中传入或传出的字节数。 当参数值非常大时,此功能非常有用。 AS LOCATOR子句指定传递参数值的定位符,而不是实际值。 仅对具有LOB数据类型或基于LOB数据类型的独特类型的参数指定AS LOCATOR。
SQL 程序不能指定 AS LOCATOR。
- 从嵌套存储过程访问结果集
- 存储过程、用户定义函数或触发器不能调用使用COMMIT ON RETURN子句定义的存储过程。
- 程序中的特殊登记
- 当被调用时,调用者的特殊寄存器的设置由程序继承,并在返回调用者时恢复。 特殊登记可以在程序中更改,但这些更改不会影响呼叫者。
- 程序中的全局变量
- 例程中引用的全局变量的内容是从调用者那里继承的。 全局变量可以在存储过程中修改,除非存储过程是由触发器或函数调用的。
如果程序中包含对全局变量的引用,则SQL数据访问级别必须至少为CONTAINS SQL。 如果程序包含修改全局变量的 SQL 语句,则 SQL 数据访问级别必须为 MODIFIES SQL DATA。