一般的,InterBase的存储过程分为两大类,它是根据客户端在调用存储过程时使用的不同方法划分的。一类是选择式存储过程,它返回一个数据集,客户端使用select语句调用存储过程,此时存储过程的作用好像和表、视图一样,选择式存储过程必须通过输出参数返回一个或多个数据行。另一类是执行式存储过程,它不返回数据集,客户端使用execute procedure来调用存储过程,这类存储过程大多数只执行一些动作而不返回数据行,当然它也可以返回输出参数信息。

大家一定要注意,InterBase不存在这样的存储过程,它既返回数据集,同时又返回输出参数,你只能选择其一,不可能两者兼得,否则就会出错。

1、创建存储过程的语法

注意:在存储过程中,除了Create Procedure,As,Begin…End语句之外,任何其他语句末尾都要添加分号结束。因此,如果你使用isql创建存储过程,你必须另外定义其它的符号来代表创建存储过程的结束,通常使用set term语句完成。比如,在创建存储过程之前,使用set term !! ;把!!作为分号来表示存储过程创建的结束,在创建存储过程的语句之后,再用set term ; !!恢复分号的作用。如: Set Term ## ; Create Procedure Add_Emp_Proj (Emp_No Smallint, Proj_Id Char(5)) As Begin

Begin

Insert Into Employee_Project (Emp_No, Proj_Id) Values (:Emp_No, :Proj_Id); When Sqlcode -530 Do Exception Unknown_Emp_Id; End Return; End ##

2、定义局部变量

定义局部变量的语法是:

DECLARE VARIABLE var datatype

再次强调一遍:每一个局部变量都必须使用上述语法进行定义,而不能一次定义多个局部变量。

特别注意:不论是输入参数、输出参数还是局部变量,如果在SQL语句中使用,前面必须加上冒号。如果不和SQL语句一起使用,则不要加冒号。

3、SUSPEND、END、EXIT语句:

SUSPEND语句在选择式存储过程中,暂时挂起存储过程的执行,并经控制权交给调用程序,直到调用程序发出下一个FETCH命令后,接着从SUSPEND下一条语句继续执行。SUSPEND同时也将存储过程的输出参数值传递给调用程序。让我们来详细地解释SUSPEND的这个功能:

当你在存储过程中使用select…into语句通过输出参数返回一个或多个数据行时,调用该存储过程的程序到底是如何获得这些数据行的呢?实际上,它采用的方法就是将存储过程返回的结果集当作一个游标来对待,存储过程的各个输出参数作为游标的字段列,然后使用FETCH命令一次从该游标取一行数据直到全部取完为止。在存储过程中使用SUSPEND,就是告诉调用程序应该用FETCH命令取数据行了。因此,SUSPEND不仅仅用在FOR SELECT语句中,任何时候当存储过程需要向调用程序返回值时,都要用SUSPEND,这样可以防止存储过程终止直到调用程序获得了返回值。这就是SUSPEND在存储过程中应用的本质。

在选择式存储过程中,SUSPEND之后的所有可执行语句均被执行,尽管此时已经没有数据行要返回。

SUSPEND语句并不被推荐在执行式存储过程中使用,因为这类存储过程一般并不返回数据行,不存在上述的游标,无需FETCH任何数据行,所以在执行式存储过程中跟在SUSPEND语句之后的所有语句都不会被执行,就像提前退出存储过程一样。InterBase强烈建议在执行式存储过程中使用EXIT来代替SUSPEND。

EXIT不论在选择式还是执行式存储过程中,其作用都是将程序执行

语句上。在选择式存储过程中,EXIT相当于提前退出存储过程的执行。

4、在存储过程中使用异常

在存储过程中激发异常,使用EXCEPTION name;其中,name是已经创建的异常名称。例如: IF (any_sales > 0) THEN EXCEPTION REASSIGN_SALES;

当异常激发时,如果没有When…Do对之进行处理,它将: ·

终止存储过程的执行,撤销存储过程所做的一切动作,包括直接的和间接的。

·向调用存储过程的程序返回异常定义的逻辑错误信息。

可见,异常特别适合用在根据一定的条件终止操作的执行并回退的情况,因此,对于实现商业逻辑具有十分重要的意义。

存储过程的结构:

CREATE PROCEDURE ProcedureName <parameter list>

RETURNS <return parameter list>

AS <local variable declarations>

BEGIN

<body of procedure>

END

1、BEGIN…END:

定义一个复合语句,BEGIN表示复合语句的开始,END代表复合语句的结束。

2、variable=expression:

赋值语句。将表达式的值赋给变量、局部变量、输入、输出参数。

再如:

Declare Variable X Integer;

Declare Variable Y Integer;

Declare Variable Z Integer;

上面的语句定义了3个局部变量,下面给它们赋值:

x = 9;

y = 2 * x;

z = 4 * x / (y - 6);

注意:在InterBase存储过程和触发器语言代码中,除了上面提到的复合语句Begin、End之外,所有的语句必须以分号结束,这一点必须明确。

3、/*…..*/:

用来在程序内注释。注释可以跨多行,但一个注释内不能嵌套另一个注释。

4、exception exception_name:

用来在存储过程或触发器中激发一个异常。例如:

Create Exception Myexception ’这是一个异常’;

激发异常: Exception Myexception;

再如:

Create Exception Reassign_Sales ’Reassign The Sales Records Before Deleting This Employee.’

If (Any_Sales > 0) Then

Exception Reassign_Sales;

5、execute procedure proc_name[var[,var…]][returning_values var[,var…]]:

执行一个存储过程,带有输入、输出参数。允许存储过程的嵌套和递归。

6、EXIT:

跳到存储过程的最后一个END语句,结束存储过程的执行。

7、单行选择语句Select…Into:

将选择的结果存储到Into之后的变量中,into子句必须放在整个选择语句的末尾。

例如:

Select Count(*) from Employee Into :varcount;

将Employee表中数据行数返回给局部变量varcount。

8、多行选择语句FOR select_statement DO compound_statement: 对select_statement

返回的每一条记录重复执行compounde_statement语句,实际是一个循环结构。其中:select_statement是必须带有into子句的选择语句,而且into子句必须放在选择语句的末尾,而且后面不能跟分号。使用该语句可以返回多个数据行。语法结构是:

For select_statement

Do

Compound_statement

例如,下面的存储过程返回多个数据行,并且实现了其它数据库的SELECT TOP-N …的功能:

CREATE PROCEDURE SP_Select_TopN_Orders (WhichCust INTEGER, HowMany SMALLINT )

RETURNS ( WhichOrd INTEGER, WhenSold DATE, HowBig FLOAT)

AS

DECLARE VARIABLE i SMALLINT;

BEGIN

    i = 0;/*局部变量,控制返回的数据行数*/

    FOR SELECT OrderID, SaleDate, TotalInvoice

    FROM Orders

    WHERE CustomerID = :WhichCust

    ORDER BY TotalInvoice DESC

     INTO :WhichOrd, :WhenSold, :HowBig/*提取信息到输出参数中*/

    DO

    BEGIN SUSPEND;/*返回输出参数*/

        i = i + 1;/*行数加1*/

        IF ( i = :HowMany ) THEN

        EXIT;/*达到规定的行数退出*/

   END

END

9、compound_statement:

单一语句或用BEGIN…END括起来的复合语句,要注意END之后没有分号。

10、IF (condition) THEN compound_statement[ELSE compound_statement]:

条件语句。如果condition条件为真,执行THEN之后的语句,否则,执行下一条语句或ELSE之后的语句。

11、POST_EVENT event_name:

发送一个事件。事件是InterBase一种异步消息机制,通过事件可以向客户端返回需要的信息。

12、SUSPEND: 暂时终止即挂起存储过程的执行,并将参数返回给客户端。这是存储过程专用的语句。

13、WHILE condition DO compound_statement:

当condition条件为真时,重复执行compounde_statement语句,直到condition条件为假时退出

14、WHEN{error[,error…]|ANY} DO compound_statement:

错误处理语句。当指定的错误之一出现时,执行compound_statement语句。如果使用了WHEN,那么必须将其放在整个存储过程或触发器的最后一个语句。error可以是异常、SQLCODE错误码、GDSCODE代码。ANY表示处理任何错误。

posted on 2011-05-10 23:46  fyen  阅读(5226)  评论(0编辑  收藏  举报