存储过程的一点相关资料

存储过程的一点相关资料

  1 存储过程的概念
通常情况下,在客户-服务器体系结构中,运行在客户端的应用程式通过SQL对服务器端的数据库进行访问时,每一条SQL语句是分别地、一句一句地从客户端向服务器发出请求,然后数据库服务器再将结果一个一个地返回给应用程式。但是,有一些应用程式,涉及的服务器端数据库处理活动很多,而和用户的交互活动较少,在这种情况下,将有关数据库的处理活动以储存过程的形式放在数据库服务器上完成,则能够大大减轻网上传输流量,提高应用程式性能。储存过程的概念如下图所示。
使用储存过程的应用程式具备以下长处:
A:减少网上传输流量;
B:改善服务器处理密集型应用的性能;
C:以访问数据库服务器特有的功能特性;
D:易于维护;
2 存储过程的程式结构
一个完整的使用储存过程的应用程式由两部分组成:一是储存过程本身,他被存放在数据库服务器端并数据库服务器上运行;二是对存储过程进行调用的客户端应用程式,他在客户端上运行。客户端应用程式和服务器端储存过程分别运行在两个不同的进程空间中,并且有不同的功能划分。
客户端应用程式的主要功能是:
A:关数据结构和主变量定义、分配并初始化存储空间;
B:和数据库进行连接;
C:通过SQL CALL语句调用存储过程
D:完成事务的提交(COMMIT)和回滚(ROLLBACK)(注:除非采用分布式工作单元,服务器端的存储过程也能够完成事务的提交和回滚);
E:执行CONNECT RESET语句;
服务器端储存过程的主要功能是:
A:接收客户端应用程式传送的SQLCA和SQLDA等数据库结构;
B:作为和客户端应用程式相同的事务在数据库服务器上运行;
C:向客户端应用程式返回SQLCA和其他输出数据;
3 客户端应用程式
客户端应用程式在使用CALL语句调用存储过程之前必须先执行几个步骤。首先,必须连接数据库,声明、分配并初始化SQLDA结构或宿主变量。
提示:不要在数据库服务器上分配这些变量结构。数据库管理系统将根据客户端应用程式中的结构在服务器端自动分配所需的存储。
客户端应用程式必须确保在调用存储过程之前已建立了数据库连接,否则,将会产生错误。
3.1 CALL 语句
客户端应用程式可通过CALL语句向服务器发出存储过程调用请求。CALL的语法格式如下所示:
CALL {(主变量1,…,主变量N)|USING DESCRIPTION 描述符名}
CALL语句的作用是将调用参数通过一个SQLDA数据结构从客户端传送给服务器端的存储过程,存储过程执行后再将输出结果通过同一个SQLDA返回给客户端应用程式。
1.有关被调用存储过程的名称的规定
1)在客户端应用程式中,被调用的存储过程的名称既能够直接给出,也能够通过一个主变量给出。
2)假如被调用的存储过程的名称是直接给出的,则他必须是个通常的标识符(identifier)并且长度不能超过254个字节。由于通常的标识符中不能含有空格或其他特别字符,所以,假如被调用的存储过程的名称中必须包含有空格或其他特别字符时,则只能使用主变量来给出其名称。
3)假如是通过主变量给出被调用的存储过程的名称,则使用的主变量必须是个具备长度属性的字符串型的变量,并且其长度不能超过254个字节。
4)被调用的存储过程的名称能够采用下列几种格式:
proname:表示要装入名为proname 的存储过程函数库并执行其中名为proname的函数;
proname!funcname:表示要装入名为proname 的存储过程函数库并执行其中名为funcname的函数;
注:按照缺省方式,在基于UNIX的平台上,数据库管理系统将在INSTHOME/sqllib/function目录中查找被隔离的(fenced)存储过程函数库。而在Intel平台上,存储过程函数库的搜索位置则由操作系统环境变量LIBPATH说明。对于不加隔离的(unfenced)存储过程函数库,其搜索位置分别是INSTHOME/sqllib/ unfenced(基于UNIX的系统)或sqllib\dll\unfenced(基于Intel的系统)。
绝对路径:如/home/user1/procname!funcname即表示要装入/home/user1目录下的名为proname 的存储过程函数库并执行其中名为funcname的函数;
2.通过宿主变量传递过程调用参数
以下是一段通过宿主变量传递过程调用参数的程式例子:
EXEC SQL BEGIN DECLARE SECTION;
char host_var1[15];
float host_var2;
short ind_var2;
long host_var3;
short ind_var3;
char procname[254] = “myproc”;
EXEC SQL END DECALRE SECTION;

strcopy(host_var1,”new data”);
host_var2 = 17.6;
ind_var2 = 0;
ind_var3 = -1;
EXEC SQL CALL :procname
(:host_var1,:host_var2 :ind_var2,:host_var3 :ind_var3);

如上面的程式段所示,在调用存储过程时,能够通过宿主变量向存储过程传递调用参数。存储过程的调用参数可分为只输入的(input only)、只输出的(output only)和既输入又输出的(both input and output)。假如调用参数没有明确被说明为只输入的(input only)或只输出的(output only),则CALL语句将其缺省处理为既输入又输出的(both input and output)的调用参数。调用参数的输入输出类型由相应的指示符变量确定。对于只输入的(input only)的调用参数其相应指示符变量的值应为0(例如,上面程式段中的host_var2);对于只输出的(output only)的调用参数其相应指示符变量的值应为-1( 例如,上面程式段中的host_var3);

3.通过SQLDA传递过程调用参数
以下是一段通过SQLDA传递过程调用参数的程式例子:
struct sqlda *inout_sqlda = (struct sqlda *)malloc(SQLDASIZE(3));
long host_var3;
short ind_var3 = -1;
short ind_var2 = 0;

inout_sqlda->sqln = 3;
inout_sqlda->sqld = 3;

inout_sqlda->sqlvar[0].sqltype = SQL_TYPE_CSTR;
inout_sqlda->sqlvar[0].sqllen = 16;
inout_sqlda->sqlvar[0].sqldata = (char *)malloc(inout_sqlda->sqlvar[0].sqllen);

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