SQL存储过程相关

首先,什么是存储过程?
存储过程是为了完成某个数据库中的特定个功能而完成的语句集。该语句集包括SQL语句(对数据的增删改查),条件语句和查询语句。
创建存储过程:
存储过程的创建方法非常简单,格式为:

CREATE PROCEDURE proc_name ([proc_parameter[,...]])    
[characteristic]   
routine_body  

说明:proc_name代表存储过程名称。
proc_parameter代表存储过程参数列表。该列表中的每个参数由三部分组成,即输入输出类型,参数名称和参数类型。其形式如下:[IN|OUT|INOUT]表示输出类型(IN表示输入参数,OUT表示输出参数;INOUT表示既可以输入也可以是输出。输入输出类型也可以去掉,默认为in);
para_name表示参数名称(注意:MYSQL数据库存储过程的参数名前不允许"@",SQL Serever数据库中可以);type表示参数类型,该类型可以是MYSQL数据库任意数据类型。
注意:MYSQL数据库存储过程不需要在参数列表括号后面加上"as"关键字,但是在SQL Server数据库中的存储过程必须加"as"关键字。
characteristic指定存储过程的特性:该参数有多个值:
LANGUAGE SQL:说明 routine_body部分是由SQL语言的语句组成,数据库系统默认值。
[NOT] DETERMINISTIC:指明存储过程的执行结果是否是确定的。DETERMINISTIC表示结果是确定的,这时,当每次执行存储过程时先通的输入会得到相同的输出。
NOT DETERMINISTIC 表示结果是非确定的,这时相同的输入可能得到不同的输出,默认为非确定。
{CONTAINS SQL | NO SQL | READS SQL DATA |MODIFIES SQL DATA}:指明子程序使用SQL语句的限制。CONTAINS SQL表示子程序包含SQL语句,但不包含读或写数据的语句;MODIFIES SQL DATA 表示子程序中包含写数据的语句。默认为CONTAINS SQL。
SQL SQCURITY{DEFINER|INVOKER}:指明谁有权限来执行。DEFINER表示只有定义者自己才能够执行;INVOKER表示调用者可以执行。默认为DEFINER。
COMMENT'string':存储过程注释信息。
routine_body_参数为存储过程体,BEGIN...END标志存储过程体的开始和结束。存储过程体可以是SELECT、UPDATE、INSERT、DELETE、CREATE TABLE、等SQL语句,也可以嵌入调用其他存储过程的代码,还可以是其他代码。
注意:不能在MYSQL存储过程中使用"return"关键字。
示例一 使用存储过程创建表的结构:

delimiter $$
create procedure create_table()
language sql
begin
create table 'user'(
     'id' int(11) not null auto_incerment commit '主键 ',
     'real_name ' varchar(8) not null comment '姓名',
     'age' int (3) default null comment ’年龄‘,
     ' primary key' ('id')
   )engine=innodb auto_increment=1 default charset=utf8;
 end &&
delimiter;

说明:上面创建了一个名称为create_table的存储过程;

    注意:MySQL中默认的语句结束符为分号(;),存储过程中的SQL语句需要分号来结束,为了避免冲突,首先用"DELIMITER &&"将MySQL的结束符设置为&&,最后再用"DELIMITER ;"来将结束符恢复成分号。这与创建触发器是一样的。
    调用存储过程:

[sql] view plain copy

CALL create_table();
示例二——向创建好的表中添加数据:
创建存储过程:

[sql] view plain copy

DELIMITER &&
CREATE PROCEDURE insert_data (IN u_real_name VARCHAR(8), IN u_age INT(3), OUT u_id INT(11))
LANGUAGE SQL
BEGIN
INSERT INTO USER (real_name, age)VALUES(u_real_name, u_age);
SET u_id=LAST_INSERT_ID();#或SET u_id=@@IDENTITY;
END &&
DELIMITER ;

    说明:上面创建的存储过程参数列表中u_real_name和u_age为输入变量,u_id为输出变量,该输出变量返回所添加数据对应的主键值;

    调用存储过程:

[sql] view plain copy

CALL insert_data('小明',21, @u_id);
SELECT @u_id;

    示例三——修改表中的数据:
    创建存储过程:
[sql] view plain copy

 
DELIMITER &&     
CREATE PROCEDURE update_data (IN u_id INT(11),IN u_real_name VARCHAR(8), IN u_age INT(3))     
LANGUAGE SQL     
BEGIN   
UPDATE USER SET real_name = u_real_name, age = u_age WHERE id = u_id;  
END &&     
DELIMITER ;  
    调用存储过程:
CALL update_data(1,'王佳佳',18);  
       示例四——依据姓名进行模糊查询获得符合条件的人数:
       创建存储过程:
[sql] view plain copy


DELIMITER &&   
CREATE PROCEDURE num_from_user (IN u_real_name VARCHAR(15), OUT count_num INT)   
READS SQL DATA   
BEGIN   
SELECT COUNT(*) INTO count_num FROM USER WHERE real_name LIKE u_real_name;   
END &&   
DELIMITER ;  
    说明:上面创建的存储过程参数列表中u_real_name为输入变量;count_num为输出变量。

SELECT语句从user表模糊查询real_name值等于u_real_name的记录,并用COUNT(*)统计符合条件的数据总数,然后将结果存入count_num中。
调用存储过程:
[sql] view plain copy

SET @u_real_name='王%';
CALL num_from_user(@u_real_name,@count_num);
SELECT @count_num AS total;
说明:上面显示姓王的人数,其中@u_real_name和@count_num为用户名变量。
示例五——依据主键id删除数据:
创建存储过程:

[sql] view plain copy

 
DELIMITER &&       
CREATE PROCEDURE delete_data (IN u_id INT(11), OUT effect_number INT(3))       
LANGUAGE SQL       
BEGIN     
DELETE FROM USER WHERE id = u_id;  
SET effect_number = ROW_COUNT();#ROW_COUNT()用于返回受影响的行数  
END &&       
DELIMITER ;  
    调用存储过程:
[sql] view plain copy

 
CALL delete_data(1, @effect_number);    
SELECT @effect_number;  
    查看存储过程:
    存储过程的查看可以通过如下语句实现:SHOW PROCEDURE STATUS  WHERE db='数据库名';或SHOW CREATE PROCEDURE 数据库名.存储过程名;
    删除存储过程: 
    存储过程的删除可以通过如下语句实现:DROP PROCEDURE 存储过程名
    存储过程优点:
    1、存储过程增强了SQL语言灵活性。存储过程可以使用控制语句编写,可以完成复杂的判断和较复杂的运算,有很强的灵活性;
    2、减少网络流量,降低了网络负载。存储过程在数据库服务器端创建成功后,只需要调用该存储过程即可,而传统的做法是每次都将大量的SQL语句通过网络发送至数据库服务器端然后再执行;
    3、存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
    4、系统管理员通过设定某一存储过程的权限实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容