创建存储过程
存储过程是一个软件模块,它可以被一个客户端调用,另一个程序,一个可执行的块或一个触发器调用。存储过程、可执行模块和触发器都是使用程序SQL(PSQL)所编写。大多数的SQL语句也可用于PSQL,有时带有限制或扩展。其中值得注意的异常是DDL和事务控制语句。
存储过程可以有多个输入和输出参数。
作用: 建立一个新的存储过程
用于: DSQL, ESQL
语法:
CREATE PROCEDURE procname
[( [, ...])]
[RETURNS ( [, ...])]
AS
[]
BEGIN
[]
END
::= [{= | DEFAULT} ]
::=
::= {literal | NULL | context_var}
::= paramname [NOT NULL]
[COLLATE collation]
::=
|
[TYPE OF] domain |
TYPE OF COLUMN rel.col
::=
{SMALLINT | INT[EGER] | BIGINT}
| {FLOAT | DOUBLE PRECISION}
| {DATE | TIME | TIMESTAMP}
| {DECIMAL | NUMERIC} [(precision [, scale])]
| {CHAR | CHARACTER | CHARACTER VARYING | VARCHAR} [(size)]
[CHARACTER SET charset]
| {NCHAR | NATIONAL CHARACTER | NATIONAL CHAR} [VARYING]
[(size)]
| BLOB [SUB_TYPE {subtype_num | subtype_name}]
[SEGMENT SIZE seglen] [CHARACTER SET charset]
| BLOB [(seglen [, subtype_num])]
::=
{ | };
[{ | }; …]
表 5.24. CREATE PROCEDURE语句的参数
参数 | 描述 |
procname | 达 31 个字符组成的存储过程名称。在数据库中的所有表、 视图和过程名称中必须是唯一 |
inparam | 输入参数描述 |
outparam | 输出参数描述 |
declarations | 声明本地变量和命名游标 |
declare_var | 局部变量声明 |
declare_cursor | 命名游标声明 |
PSQL_statements | 程序的 SQL 语句 |
literal | 是赋值兼容的文本值与参数的数据类型 |
context_var | 其类型是兼容的数据类型参数的任何上下文变量 |
paramname | 程序的输入或输出参数的名称。它可能包括达 31 个字符。参数的名称必须是唯一的输入和输出参数的过程和其本地变量之间 |
datatype | SQL的数据类型 |
collation | 归类序列 |
domain | 域的名称 |
rel | 表或视图的名称 |
col | 表或视图的列名称 |
precision | 则参数应能对 hold(1..18)的有效位数总数 |
scale | 小数点(0..precision)后的数字位数 |
size | 字符串类型的参数或变量,以字符为单位的最大的大小 |
charset | 字符集的字符串类型的参数或变量 |
subtype_num | BLOB 子类型数量 |
subtype_name | BLOB 子类助记符名称 |
seglen | 段大小 (最大 65535) |
CREATE PROCEDURE语句建立一个新的存储过程.过程的名称必须是唯一的,在数据库中所有存储过程,表和视图的名称之中。
CREATE PROCEDURE是一个复合语句,由头和主体组成。头指定存储过程的名称和声明输入参数和输出参数,如果有输出参数的话,被的程序返回。
程序主体由任何声明局部变量和命名游标组成,它们将被程序使用,紧随其后的是一个或多个语句,或语句块,所有封闭的外块从关键字BEGIN开始,结束于关键字END。声明和嵌入语句以分号(;)终止。
语句结束符
一些 SQL 语句编辑器 — — Firebird专门配备的isql 实用工具和一些第三方的编辑器 — — 使用其内部的约定,要求所有语句都以分号结束。
在这些环境中编码时, 这将同PSQL语法产生一个冲突。如果你不知道这个问题及其解决方案,请详细信息学习PSQL 章中题为 在isql中切换结束符号一节。
参数
每个参数都为它指定数据类型。对于任何参数,也可以指定 NOT NULL 约束,为了防止 NULL 传递到或分配给它。
可以为字符串类型的参数,使用 COLLATE 子句指定一个排序规则序列。
输入参数
输入的参数列表被显示在过程名称后的圆括号中。它们被作为值传递到过程,所以任何改变它们里面的程序没有任何影响在调用程序中的参数。
输入的参数可以有默认值。那些为它们指定的值必须是位于参数列表的末尾。
输出参数
可选的 RETURNS 子句用于程储过程指定输出参数,参数列表位于一对圆括号中。
在声明中使用域(Domains)
一个域的名称可以用于指定为一个参数的类型。参数将继承所有域的属性。如果为参数指定一个默认值,它将覆盖域定义中指定的默认值。
如果TYPE OF子句添加域的名称之前,只使用域的数据类型:任何的域的其他属性——NOT NULL约束,CHECK约束,默认值——既不检查也不使用。然而,如果域是一个文本类型,其字符集和排序序列总是使用。
在声明中使用列的类型
输入和输出参数也可以声明使用现有表和视图的列数据类型。TYPE OF COLUMN子句用于指定relationname.columnname作为其参数。
当TYPE OF COLUMN被使用时,参数只继承了数据类型,及对于字符串类型的字符集和和排序顺序。列的约束和默认值被忽略。
pre-Firebird 3 版本的 bug 警告 ︰
对于输入参数,附带的列类型的排序规则在比较中(例如相等,测试)被忽略。对于本地变量,行为发生了变化。
这个bug在Firebird 3中已被修正。
声明变量和游标
可选的声明部分,位于存储过程定义头部的最后部分,定义程序的局部变量和它的命名的游标。局部变量声明遵循同参数作为数据类型规范的相同规则。详细参阅PSQL章节DECLARE VARIABLE 和 DECLARE CURSOR.
头部后面紧接着是过程的主体,包括一个或多个PSQL语句封闭外部关键字BEGIN和END之间。多个BEGIN ... END结束块语句可以嵌入过程体内部。
任何连接到数据库的用户可以创建新的存储的过程。创建存储的过程的用户成为其所有者。
.