EXEC SQL CALL myproc USING DESCRIPTOR :*inout_sqlda;
如上面的程序段所示,在调用存储过程时,也可以通过SQLDA向存储过程传递调用参数。
3.2 创建存储过程
以下是通过CREATE PROCEDURE语句创建存储过程的例子:
CREATE PROCEDURE MYPROC(INOUT HOST1 CHAR(15),
IN HOST2 DOUBLE, OUT HOST3 INTEGER)
EXTERNAL NAME ‘/home/user1/myfn!fn1’
LANGUAGE C
PARAMETER STYLE DB2DARI
4 服务器端存储过程的实现
4.1实现存储过程的函数定义
在UDB中,存储过程的实现代码一般可应用某种编程语言(如C、C++或JAVA等)来编写。下面以C语言为例,说明在编写存储过程的实现代码时应注意的事项。
SQL_API_RC SQL_API_FN
myproc(void *reserved1,
void *reserved2,
struct sqlda * inout_sqlda,
struct sqlca *ca)
{
/* no connecttion related statements */
/* runs in background */
/* no command to terminate current process *./
/* (no exit, _exit, or at exit) */
/* if DUOW no COMMIT or ROLLBACK */
return(ret_value);
}
1)上面程序段开头的SQL_API_RC和SQL_API_FN为2个预定义的宏,目的是程序的可移植性;
2)在实现存储过程的函数体中不能出现与数据库连接相关的语句,即不能出现CONNECT,CONNECT RESET,CREATE DATABASE,DROP DATABASE,ALTER DATABASE,BACKUP,RESTORE,ROLLFORWORD等语句;
3)由于存储过程只在后台运行,所以不允许有写屏幕(如,printf)的动作,但允许写文件(fprintf);
4)存储过程的函数体只是一个被数据库管理系统调用的程序例程,所以当执行结束时总是应当将控制交还该调用它的函数,而不应终止当前进程,即在其函数体中不应出现exit(),_exit()这样的函数调用;
5)如果调用存储过程的客户端应用程序的数据库连接类型(CONNECT TYPE)为DUOW,则存储过程中不能发出终止事务的语句,即无论动态或静态的COMMIT、ROLLBACK都不允许出现。
4.2 存储过程的参数传递
SQL_API_RC SQL_API_FN
myproc(void *reserved1,void *reserved2,
struct sqlda *inout_sqlda, struct sqlca *ca)
{
struct sqlca sqlca; /*for local use */
/* use input data in SQLDA */
/* do not change SQLD,SQLTYPE, or SQLLEN */
/* do not change pointer for SQLDATA or SQLIND */
/* return data in SQLDATA(and SQLIND) */
memcpy(ca,&sqlca,sizeof(struct sqlca));
…
4.3存储过程的返回值
SQL_API_RC SQL_API_FN
myproc(void *reserved1,void *reserved2,
struct sqlda *inout_sqlda, struct sqlca *ca)
{
/* processing */
/* in this application,the second SQLVAR field
is used to determine if the client intends to
call the server procedure again, A value of 0
means no further calls. */
if((*float *)inout_sqlda->sqlvar[1].sqlda != 0)
return(SQLZ_HOLD_PROC)
else
return(SQL_DISCONNECT_PROC);
}
1) 应当特别注意的是,存储过程的返回值根本不会返回给客户端应用程序。这里所说的返回值的作用是使数据库管理系统能够确定当存储过程执行终止时是否将存储过程从内存中释放掉。
2) 存储过程可以向数据库管理系统返回下列2个值:
—SQL_DISCONNECT_PROC:其含义是告诉数据库管理系统当所有信息都传递给客户端后,即可释放(或卸载)存储过程及其数据存储;
—SQL_HOLD_PROC:其含义是告诉数据库管理系统将存储过程库函数仍然保持在内存当中,这样将可以保证当客户端下一次发出对该存储过程的DARI调用时被调用的库函数已经在内存当中了,从而提高系统性能。
3) 如果客户端只对存储过程调用一次,则应返回SQL_DISCONNECT_PROC;
4) 如果客户端需要对存储过程调用多次,则应返回SQL_HOLD_PROC,从而保证存储过程不会被卸载;
5) 如果存储过程以SQL_HOLD_PROC作为返回值,则当其被最后一次调用时则应以SQL_DISCONNECT_PROC作为返回值,从而保证最后一次调用后将存储过程从内存中释放掉。否则该存储过程将被一直保存在主存中,直到数据库管理系统停止运行;
客户端应用程序在对存储过程进行最后一次调用时,应将这一信息通知被调用的存储过程。