手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网站运营>建站经验>列表

存储过程的一点相关资料

来源:互联网 作者:west263.com 时间:2008-04-16
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

strcpy(inout_sqlda->sqlvar[0].sqldata,”new data”);

inout_sqlda->sqlvar[1].sqltype = SQL_TYPE_NFLOAT;
inout_sqlda->sqlvar[1].sqllen = sizeof(float);
inout_sqlda->sqlvar[1].sqldata = (char *)malloc(inout_sqlda->sqlvar[1].sqllen);
*(float *) inout_sqlda->sqlvar[1].sqldata = 17.6;
inout_sqlda->sqlvar[1].sqlind = &ind_var2;

inout_sqlda->sqlvar[2].sqltype = SQL_TYPE_NINTEGER;
inout_sqlda->sqlvar[2].sqllen = sizeof(long);
inout_sqlda->sqlvar[2].sqldata = (char *)&host_var3;
inout_sqlda->sqlvar[1].sqlind = &ind_var3;

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

1)CREATE PROCEDURE语句的作用是向数据库服务器注册一个新的存储过程;
2)MYPROC为存储过程的指定名。客户端应用程式能够在CALL语句使用这一名字调用相应的存储过程;
3)INOUT HOST1 CHAR(15)表示存储过程中所需的一个调用参数。其中,参数输入输出类型INOUT表明该参数既可向存储过程提供输入信息,也可接收从存储过程返回的信息。参数输入输出类型IN表示相应的参数只用于输入(input only);参数输入输出类型OUT表示相应的参数只用于输出(output only);
4)在同一个模式下,不允许定义名称、参数个数和数据类型都完全相同的存储过程;
5)EXTERNAL NAME(外部名)表示用户为实现所定义的存储过程而编写的程式代码段的名称;
6)LANGUAGE C 在CREATE PROCEDURE语句中是必不可少的,其作用是指明存储过程体的语言接口约定。该子句的另一个选项是LANGUAGE JAVA;
7)PARAMETER STYLE 的作用是说明向存储过程传递参数连同从存储过程接收返回结果的有关约定。DB2DARI表明存储过程使用的参数传递约定将和C语言的函数调用和连接约定相兼容;PARAMETER STYLE DB2DARI必须和LANGUAGE C一起使用。DB2GENERAL表明存储过程使用的参数传递约定将和JAVA语言的函数调用和连接约定相兼容;PARAMETER STYLE DB2GENERAL必须和LANGUAGE JAVA一起使用;

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));


1) 存储过程将通过SQLDA中的输入变量得到客户端应用程式传来的输入参数,然后再通过SQLDA中的输出变量将输出结果返回给客户端应用程式。由于SQLDA各个域的原始值都是由客户端应用程式在过程调用前配置的,因此,存储过程的函数体不应改变SQLDA中的SQLD,SQLTYPE,SQLLEN等域的值。此外,虽然存储过程的函数体能够改变SQLDATA及SQLIND中所含指针指向的变量的值,但却不应改变SQLDATA及SQLIND中所含的指针。
注:SQLDA中的变量能够同时既是输入变量又是输出变量。
2) 在存储过程的函数体返回之前,应当显式地将本地SQLCA中的信息拷贝到存储过程的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个值:

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!