存储过程操作

来源:互联网 发布:plc编程难吗 编辑:程序博客网 时间:2024/05/23 11:07

一.什么是存储过程

简单地说,存储过程(stored procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。由于SQL语句执行的时候要先编译,然后执行,用户通过指定存储过程的名字并给出参数(如果带有参数)来执行它。

(1).存储过程增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。

(2).存储过程允许标准组件是编程。存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。

(3).存储过程能实现较快的执行速度。如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。

(4).存储过程能过减少网络流量。针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织程存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。

(5).存储过程可被作为一种安全机制来充分利用。系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。

二.存储过程的语法

 CREATE    [DEFINER = { user | CURRENT_USER }]    PROCEDURE sp_name ([proc_parameter[,...]])    [characteristic ...] routine_body

存储过程默认与当前数据库关联。要明确地把存储程序与一个给定数据库关联起来,可以在创建存储程序的时候指定其名称为db_name.sp_name。

存储程序可以使用begin...end复合语句来包含多个语句。语法如下:

[begin_label:] begin      [statement_list]end [end_label]

statement_list代表一个或多个语句的列表。statement_list之内每个语句都必须用份好(;)来结尾。

在存储过程中变量使用DECLARE来声明(DEFAULT是赋默认值,SET赋值):

DECLARE var_name [,...] type [DEFAULT value]
例如:

DECLARE counter INT DEFAULT 0;SET counter = counter +1;

例如,我们创建一个简单的存储过程:

delimiter $$create procedure sp_add(a INT,b INT,OUT c INT)      BEGIN        SET c=a+b;    END $$

在MySQL中,与存储过程相对应的一个重要概念是函数。存储过程和函数都是用语句创建的子程序,分别用CREATE PROCEDURE 和 CREATE FUNCTION创建。

使用CALL语句来调用程序,程序只能用输出变量传回值。

存储函数与存储过程的区别:

1)存储函数的参数列表只允许IN类型的参数,而且没必要也不允许指定IN关键字。

2)存储函数返回一个单一的值(标量),值的类型在存储函数的头部定义。

3)函数可以在SQL语句内部调用。

4)函数不能返回结果集。


下面创建一个简单的函数:

delimiter $$CREATE FUNCTION first_func(param1 varchar(5),parmam2 varchar(5),param3 varchar(10))RETURNS TINYINTBEGIN   RETURN 1;END $$


创建函数语句:

 CREATE    [DEFINER = { user | CURRENT_USER }]    FUNCTION sp_name ([func_parameter[,...]])    RETURNS type    [characteristic ...] routine_body

三.存储过程的使用

数据库存储过程的实质就是部署在数据库端的一组定义代码以及sql。将常用的或很复杂的工作,预先用sql语句写好并用一个指定的名称存储起来,那么以后要让数据库提供与已定义好的存储过程的功能相同的服务时,只需调用即可自动完成命令。

例如,创建存储过程 sp_demo:

create procedure ordertotal(                             in  onumber int,                             out ototal decimal(8,2))begin     select sum(item_price*quantity) from ordertiems     where order_num = onumber into ototal;end;
这是 一个带in 和 out参数的存储过程,in用于表明此值是用于从存储过程里输入的,而out用于表明此值是用于从存储过程里输出的。begin。。end 之间是存储过程的主体定义,使用分号 ; 作为分隔符。

调用存储过程的方法比较简单,使用 call 语句即可。

cal sp_name([parameter[...]])

call 语句调用一个先前用 create procedure 创建的存储过程。call 语句可以用声明为out或in的参数给它的调用者传回值。他也‘返回’受影响的行数,客户端程序可以在sql级别通过调用 row_count() 函数获得这个数,在c语言中是调用 c api 函数 mysql_affected_rows()来获得。

注意,如果存储过程没有参数,即不用传递参数,存储过程名字后面的括号‘()’ 页必须要有。

例如,我们可以这样调用刚才创建的存储过程 ordertotal:

call ordertotal(10,@total)

使用select语句获取 @total值

select @total

在存储过程中使用流程控制语句的方法与一般编程语句类似,每个流程分支包含要么是一个单独语句,要么是使用begin。。end复合语句的一块语句。


0 0
原创粉丝点击