Experiment 08 存储过程的基本操作
- 格式:pptx
- 大小:50.99 KB
- 文档页数:10
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3.存储过程可以重复使用,可减少数据库开发人员的工作量4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权一、基本语法1.基本结构CREATE [OR REPLACE] PROCEDURE procedure_name[(parameter1 [model][U1] datatype1,parameter2 [model] datatype2 ...)]IS [AS]BEGINPL/SQL Block;END [procedure_name];其中:procedure_name是存储过程的名字,parameter用于指定参数,model用于指定参数模式,datatype用于指定参数类型,IS [AS]用于开始PL/SQL代码块。
注:当定义存储过程的参数时,只能指定数据类型,不能指定数据长度1)建立存储过程时,既可以指定存储过程的参数,也可以不提供任何参数。
2)存储过程的参数主要有三种类型:输入参数(IN)、输出参数(OUT)、输入输出参数(IN OUT),其中IN用于接收调用环境的输入参数,OUT用于将输出数据传递到调用环境,IN OUT不仅要接收数据,而且要输出数据到调用环境。
3)在建立存储过程时,输入参数的IN可以省略。
将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条。
示例:CREATE OR REPLACE PROCEDURE USP_Learing(p_para1 varchar2 := '参数一',p_para2 nvarchar2 default '参数二',p_para3 out varchar2,p_para4 in out varchar2)ISBEGINDECLAREv_para5 varchar2(20);BEGINv_para5 := '输入输出:'||[U2] p_para4;p_para3 := '输出:'||p_para1||p_para2;p_para4 := v_para5;END;END USP_Learing;2.变量赋值V_TEST :=[U3] 123;3.IF判断IF V_TEST=1 THENBEGINdo somethingEND;END IF;--if 范例create or replace procedure myp12isbegindeclaretest number(10);begintest := 100;if test=100 thendbms_output.put_line('相同');elsedbms_output.put_line('不相同');end if;end;end myp12;4.while循环WHILE V_TEST=1 LOOPBEGINXXXXEND;END LOOP;注:SQL Server 中没有For循环,可以使用while循环代替--while循环create or replace procedure myp14ISBEGINDECLAREbonus boolean;BEGIN -- executable part starts herebonus := false;while bonus=false loopdbms_output.put_line('进入while循环');bonus := true;end loop;END;END myp14;5.用for in 使用cursor(游标)ISCURSOR cur IS SELECT * FROM xxx;BEGINFOR cur_result in cur LOOPBEGINV_SUM :=cur_result.列名1+cur_result.列名2END;END LOOP;END;6.带参数的cursorCURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID; OPEN C_USER(变量值);LOOPFETCH C_USER INTO V_NAME;EXIT FETCH C_USER%NOTFOUND;do somethingEND LOOP;CLOSE C_USER;二、存储过程的维护1.删除存储过程DROP PROCEDURE procedure_name;2.编译存储过程ALTER PROCEDURE procedure_name COMPILE;3.与存储过程相关的几个查询①查看无效的存储过程SELECT object_nameFROM USER_OBJECTSWHERE STATUS='INVALID'AND OBJECT_TYPE='PROCEDURE'②查看存储过程的代码SELECT TEXTFROM USER_SOURCEWHERE NAME= procedure_name其中:procedure_name是存储过程的名字三、调用存储过程当在SQL*PLUS中调用存储过程时,需要使用CALL或EXECUTE(exec)命令,而在PL/SQL 块中可以直接引用。
存储过程及流程控制语句存储过程是⼀个SQL语句集合,当主动去调⽤存储过程时,其中内部的SQL语句会按照逻辑执⾏。
1、创建存储过程对于存储过程,可以接收参数,其参数有三类:in 仅⽤于传⼊参数⽤out 仅⽤于返回值⽤inout 既可以传⼊⼜可以当作返回值有参数的存储过程-- 创建存储过程delimiter \\create procedure p1(in i1 int,in i2 int,inout i3 int,out r1 int)BEGINDECLARE temp1 int;DECLARE temp2 int default 0;set temp1 = 1;set r1 = i1 + i2 + temp1 + temp2;set i3 = i3 + 100;end\\delimiter ;-- 执⾏存储过程set @t1 =4;set @t2 = 0;CALL p1 (1, 2 ,@t1, @t2);SELECT @t1,@t2;1. 结果集delimiter //create procedure p1()beginselect * from v1;end //delimiter ;2. 结果集+out值delimiter //create procedure p2(in n1 int,inout n3 int,out n2 int,)begindeclare temp1 int ;declare temp2 int default 0;select * from v1;set n2 = n1 + 100;set n3 = n3 + n1 + 100;end //delimiter ;3. 事务delimiter \\create PROCEDURE p1(OUT p_return_code tinyint)BEGINDECLARE exit handler for sqlexceptionBEGIN-- ERRORset p_return_code = 1;rollback;END;DECLARE exit handler for sqlwarningBEGIN-- WARNINGset p_return_code = 2;rollback;END;START TRANSACTION;DELETE from tb1;insert into tb2(name)values('seven');COMMIT;-- SUCCESSset p_return_code = 0;END\\delimiter ;4. 游标delimiter //create procedure p3()begindeclare ssid int; -- ⾃定义变量1declare ssname varchar(50); -- ⾃定义变量2DECLARE done INT DEFAULT FALSE;DECLARE my_cursor CURSOR FOR select sid,sname from student;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; open my_cursor;xxoo: LOOPfetch my_cursor into ssid,ssname;if done thenleave xxoo;END IF;insert into teacher(tname) values(ssname);end loop xxoo;close my_cursor;end //delimter ;5. 动态执⾏SQLdelimiter \\CREATE PROCEDURE p4 (in nid int)BEGINPREPARE prod FROM 'select * from student where sid > ?';EXECUTE prod USING @nid;DEALLOCATE prepare prod;END\\delimiter ;2、删除存储过程drop procedure proc_name;3、执⾏存储过程执⾏存储过程-- ⽆参数call proc_name()-- 有参数,全incall proc_name(1,2)-- 有参数,有in,out,inoutset @t1=0;set @t2=3;call proc_name(1,2,@t1,@t2)pymysql执⾏存储过程#!/usr/bin/env python# -*- coding:utf-8 -*-import pymysqlconn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1') cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)# 执⾏存储过程cursor.callproc('p1', args=(1, 22, 3, 4))# 获取执⾏完存储的参数cursor.execute("select @_p1_0,@_p1_1,@_p1_2,@_p1_3")result = cursor.fetchall()mit()cursor.close()conn.close()print(result)MariaDB [sqlexample]> delimiter $$; MariaDB [sqlexample]> select * from class; -> select * from course$$;+-----+--------------+| cid | caption |+-----+--------------+| 1 | 三年⼆班 || 2 | 三年三班 || 3 | ⼀年⼆班 || 4 | ⼆年九班 || 5 | 全栈⼆班 || 6 | 全栈⼆班 || 7 | uuu || 8 | 'nnn' || 9 | op || 10 | ooo || 11 | ooo || 12 | ooo1 || 13 | ooo2 |+-----+--------------+13 rows in set (0.00 sec)+-----+--------+------------+| cid | cname | teacher_id |+-----+--------+------------+| 1 | ⽣物 | 1 || 2 | 物理 | 2 || 3 | 体育 | 3 || 4 | 美术 | 2 |+-----+--------+------------+4 rows in set (0.00 sec)MariaDB [sqlexample]> delimiter ; MariaDB [sqlexample]> delimiter $$ MariaDB [sqlexample]> create procedure p1() -> BEGIN-> select * from class;-> END $$Query OK, 0 rows affected (0.00 sec) MariaDB [sqlexample]> delimiter ; MariaDB [sqlexample]> call p1();+-----+--------------+| cid | caption |+-----+--------------+| 1 | 三年⼆班 || 2 | 三年三班 || 3 | ⼀年⼆班 || 4 | ⼆年九班 || 5 | 全栈⼆班 || 6 | 全栈⼆班 || 7 | uuu || 8 | 'nnn' || 9 | op || 10 | ooo || 11 | ooo || 12 | ooo1 || 13 | ooo2 |+-----+--------------+13 rows in set (0.01 sec)Query OK, 0 rows affected (0.01 sec) MariaDB [sqlexample]> delimiter // MariaDB [sqlexample]> create procedure p2( -> in i1 int,-> in i2 int,-> inout i3 int,-> out r1 int-> )-> BEGIN-> DECLARE temp1 int;-> DECLARE temp2 int default 0;-> set temp1 = 1;-> set r1 = i1 + i2 + temp1 + temp2;-> set i3 = i3 + 100;-> select * from student;-> end //Query OK, 0 rows affected (0.00 sec) MariaDB [sqlexample]> delimiter ;stored_procedure.py#!/usr/bin/env python3.8# -*- coding: UTF-8 -*-# __author: smoke# file: stored_procedure# time: 2021/10/27import pymysqlconn = pymysql.connect(host='172.16.100.67', port=3306, user='root', passwd='smoke520', db='sqlexample', charset='utf8')cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)# 执⾏存储过程r1 = cursor.callproc('p2', args=(1, 22, 3, 4))print(r1)# 获取执⾏完存储的参数r2 = cursor.execute("select @_p1_0,@_p1_1,@_p1_2,@_p1_3")print(r2)cursor.close()conn.close()/home/smoke/⽂档/DocumentFile/PycharmProjects/pythonProject/venv/bin/python /home/smoke/⽂档/DocumentFile/PycharmProjects/pythonProject/use_mysqlDB/stored_procedure.py (1, 22, 3, 4)1Process finished with exit code 0#!/usr/bin/env python3.8# -*- coding: UTF-8 -*-# __author: smoke# file: stored_procedure# time: 2021/10/27import pymysqlconn = pymysql.connect(host='172.16.100.67', port=3306, user='root', passwd='smoke520', db='sqlexample', charset='utf8')cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)# 执⾏存储过程r1 = cursor.callproc('p2', args=(1, 22, 3, 4))print(r1)# 获取执⾏完存储的参数r2 = cursor.execute("select @_p1_0,@_p1_1,@_p1_2,@_p1_3")print(r2)result = cursor.fetchall()print(result)cursor.close()conn.close()/home/smoke/⽂档/DocumentFile/PycharmProjects/pythonProject/venv/bin/python /home/smoke/⽂档/DocumentFile/PycharmProjects/pythonProject/use_mysqlDB/stored_procedure.py (1, 22, 3, 4)1[{'@_p1_0': None, '@_p1_1': None, '@_p1_2': None, '@_p1_3': None}]Process finished with exit code 0#!/usr/bin/env python3.8# -*- coding: UTF-8 -*-# __author: smoke# file: stored_procedure# time: 2021/10/27import pymysqlconn = pymysql.connect(host='172.16.100.67', port=3306, user='root', passwd='smoke520', db='sqlexample', charset='utf8')cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)# 执⾏存储过程r1 = cursor.callproc('p2', args=(1, 22, 3, 4))print(r1)# 获取执⾏完存储的参数r2 = cursor.execute("select @_p2_0,@_p2_1,@_p2_2,@_p2_3")print(r2)result = cursor.fetchall()print(result)cursor.close()conn.close()/home/smoke/⽂档/DocumentFile/PycharmProjects/pythonProject/venv/bin/python /home/smoke/⽂档/DocumentFile/PycharmProjects/pythonProject/use_mysqlDB/stored_procedure.py (1, 22, 3, 4)1[{'@_p2_0': 1, '@_p2_1': 22, '@_p2_2': 103, '@_p2_3': 24}]Process finished with exit code 0#!/usr/bin/env python3.8# -*- coding: UTF-8 -*-# __author: smoke# file: stored_procedure# time: 2021/10/27import pymysqlconn = pymysql.connect(host='172.16.100.67', port=3306, user='root', passwd='smoke520', db='sqlexample', charset='utf8')cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)r1 = cursor.callproc('p2', args=(1, 22, 3, 4))print(r1)result1 = cursor.fetchall()print(result1)# 获取执⾏完存储的参数r2 = cursor.execute("select @_p2_0,@_p2_1,@_p2_2,@_p2_3")print(r2)result2 = cursor.fetchall()print(result2)cursor.close()conn.close()/home/smoke/⽂档/DocumentFile/PycharmProjects/pythonProject/venv/bin/python /home/smoke/⽂档/DocumentFile/PycharmProjects/pythonProject/use_mysqlDB/stored_procedure.py (1, 22, 3, 4)[{'sid': 1, 'gender': '男', 'class_id': 1, 'sname': '马⼤狗'}, {'sid': 2, 'gender': '⼥', 'class_id': 1, 'sname': '钢蛋'}, {'sid': 3, 'gender': '男', 'class_id': 1, 'sname': '张三'}, {'sid': 4, 'gender': '男','class_id': 1, 'sname': '张⼀'}, {'sid': 5, 'gender': '⼥', 'class_id': 1, 'sname': '张⼆'}, {'sid': 6, 'gender': '男', 'class_id': 1, 'sname': '张四'}, {'sid': 7, 'gender': '⼥', 'class_id': 2, 'sname': '铁锤'}, {'sid': 8, 'gender': '男', 'class_id': 2, 'sname': '李三'}, {'sid': 9, 'gender': '男', 'class_id': 2, 'sname': '李⼀'}, {'sid': 10, 'gender': '⼥', 'class_id': 2, 'sname': '李⼆'}, {'sid': 11, 'gender': '男', 'class_id': 2, 'sname': '李四'}, {'sid': 12, 'gender': '⼥', 'class_id': 3, 'sname': '如花'}, {'sid': 13, 'gender': '男', 'class_id': 3, 'sname': '刘三'}, {'sid': 14, 'gender': '男', 'class_id': 3,'sname': '刘⼀'}, {'sid': 15, 'gender': '⼥', 'class_id': 3, 'sname': '刘⼆'}, {'sid': 16, 'gender': '男', 'class_id': 3, 'sname': '刘四'}, {'sid': 17, 'gender': '⼥', 'class_id': 1, 'sname': '鸭蛋'}, {'sid': 18, 'gender': '⼥', 'class_id': 1, 'sname': '鸭蛋1'}, {'sid': 19, 'gender': '⼥', 'class_id': 1, 'sname': '鸭蛋2'}, {'sid': 20, 'gender': '⼥', 'class_id': 1, 'sname': '鸭蛋3'}]1[{'@_p2_0': 1, '@_p2_1': 22, '@_p2_2': 103, '@_p2_3': 24}]Process finished with exit code 0其他1、条件语句if条件语句delimiter \\CREATE PROCEDURE proc_if ()BEGINdeclare i int default 0;if i = 1 THENSELECT 1;ELSEIF i = 2 THENSELECT 2;ELSESELECT 7;END IF;END\\delimiter ;2、循环语句while循环delimiter \\CREATE PROCEDURE proc_while ()BEGINDECLARE num INT ;SET num = 0 ;WHILE num < 10 DOSELECTnum ;SET num = num + 1 ;END WHILE ;END\\delimiter ;repeat循环delimiter \\CREATE PROCEDURE proc_repeat ()BEGINDECLARE i INT ;SET i = 0 ;repeatselect i;set i = i + 1;until i >= 5end repeat;END\\delimiter ;loopBEGINdeclare i int default 0;set i=i+1;if i<8 theniterate loop_label;end if;if i>=10 thenleave loop_label;end if;select i;end loop loop_label;END3、动态执⾏SQL语句动态执⾏SQLdelimiter \\DROP PROCEDURE IF EXISTS proc_sql \\CREATE PROCEDURE proc_sql ()BEGINdeclare p1 int;set p1 = 11;set @p1 = p1;PREPARE prod FROM 'select * from tb2 where nid > ?'; EXECUTE prod USING @p1;DEALLOCATE prepare prod;END\\delimiter ;。
Oracle存储过程总结1、创建存储过程create or replace procedure test(var_name_1 in type,var_name_2 out ty pe) as--声明变量(变量名变量类型)begin--存储过程的执行体end test;打印出输入的时间信息E.g:create or replace procedure test(workDate in Date) isbegindbms_output.putline(The input date is:||to_date(workDate, yyyy-mm-d d));end test;2、变量赋值变量名 := 值;E.g:create or replace procedure test(workDate in Date) isx number(4,2);beginx := 1;end test;3、判断语句:if 比较式 then begin end; end if;E.gcreate or replace procedure test(x in number) isbeginif x >0 thenbeginx := 0 - x;end;end if;if x = 0 thenbeginx: = 1;end;end if;end test;4、For 循环For ... in ... LOOP--执行语句end LOOP;(1)循环遍历游标create or replace procedure test() asCursor cursor is select name from student;name varchar(20);beginfor name in cursor LOOPbegindbms_output.putline(name);end;end LOOP;end test;(2)循环遍历数组create or replace procedure test(varArray in myPackage.TestArray) as --(输入参数varArray 是自定义的数组类型,定义方式见标题6)i number;begini := 1; --存储过程数组是起始位置是从1开始的,与java、C、C++等语言不同。
存储过程详解1,创建⼀个简单存储过程⽰例:create Procedure user --创建名为user存储过程as --指定过程要执⾏下⾯操作select * from tablenamego2,调⽤存储过程⽰例:exec user 或者 execute user执⾏后结果为:select * from tablename 查询的结果3,修改存储过程⽰例:alter Procedure 存储过程名4,删除存储过程⽰例:drop Procedure 存储过程名5,带⼀个参数的存储过程⽰例:if (exists (select * from sys.objects where name = 'user')) --如果有user这个存储过程drop Procedure user --删除usergocreate Procedure user --创建user存储过程(@UserID int) --声明⼀个输⼊参数asselect * from stud where studid=@UserID; --查询学⽣表中输⼊的userid的信息--执⾏user 存储过程exec user 1; --这⾥的1就是Userid6、创建带返回值的存储过程⽰例:if (exists (select * from sys.objects where name = 'user'))drop Procedure usergocreate Procedure user(@UserName varchar(20),--输⼊参数,⽆默认值@UserId int output --输⼊/输出参数⽆默认值,output 返回参数)asselect @UserId=studId from stud where studname=@UserName --通过UserName找UserId--执⾏User这个带返回值的存储过程declare @id int --声明⼀个变量⽤来接收执⾏存储过程后的返回值exec user '李四',@id output --执⾏存储过程。
存储过程一、创建存储过程创建存储过程的步骤:1、编写Transact_SQL语句;2、测试Transact_SQL语句3、若得到所需结果。
则创建存储过程4、执行过程/*创建存储过程 */CREATE PROCEDURE my_procedure1ASselect *from orderswhere orderdate>='1/1/1998' and shipcountry='USA'GO/* 执行存储过程 */use northwindgoexec my_procedure1/* */创建存储过程的注意事项:1、不要将CREATE PROCEDURE 语句与其他SQL语句组合到单个批处理中,每一个批处理就是一个go语句段2、具有操作权限的用户才能创建存储过程,默认为数据库所有者3、存储过程是个数据库对象,命名必须符合标识符规则,在命名自定义的存储过程时避免使用sp前缀,以免与系统存储过程混淆4、存储过程只能在当前数据库创建,最大尺寸为128MB,可以嵌套,至多嵌套32级。
二、查看存储过程的内容1、执行系统存储过程sp_stored_procedures来查看数据库中所有的存储过程及其所有者的列表。
2、到企业管理器中查看3、执行系统存储过程sp_helptext,sp_help,sp_depends 来查看。
/*******************************/USE NorthwindEXEC sp_stored_proceduresGo/*******************************/USE NorthwindEXEC sp_helptext my_procedure1/*******************************/三、创建含有输入参数的存储过程在存储过程中可以声明一个或多个变量作为参数声明输入参数的格式:@parameter_name datatype[=default]/*******************************/USE NorthwindGoCreate proc my_procedure2@startdate datetime,@enddate datetime,@country varchar(20)='USA'ASIf (@startdate IS NULL or @enddate IS NULL or @country IS NULL)BEGINRaiserror('NULL values are invalid',5,5)RETURNENDSelect * from ordersWhere orderdate between @startdate and @enddate and shipcountry=@country Go/*******************************/四、执行含有输入参数的存储过程1、使用参数名传递参数值语法格式:EXEC procedure_name[@parameter_name=value][,…n]/*******************************/USE NorthwindGoEXEC my_procedure2@enddate='2/1/1999',@startdate='7/1/1998'/*******************************/2、按位置来传递参数值语法格式:EXEC procedure_name[value1,value2,…]/*******************************/USE NorthwindEXEC my_procedure2'2/1/1998','7/1/1997','USA'/*******************************/五、创建含有输出参数的存储过程语法格式:@parameter_name datatype[=default] OUTPUT/*******************************/USE NorthwindGocreate procedure my_procedure3@startdate datetime,@enddate datetime,@country varchar(20)='USA',@recordcount int OUTPUTASIF @startdate IS NULL Or @enddate IS NULL or @country IS NULLBEGINraiserror ('NULL value are invalid',5,5)returnENDselect * from orderswhere orderdate between @startdate and @enddate and shipcountry=@country select @recordcount=@@ROWCOUNT/*******************************/六、执行含有输出参数的存储过程/*******************************/USE NorthwindGoDECLARE @recordnumber intEXEC my_procedure3'7/1/1997','2/1/1998','Germany',@recordnumber OUTPUTPRINT 'The order count is :'+str(@recordnumber)go/*******************************/七、修改存储过程/*******************************/USE NorthwindGoALTER proc my_procedure1WITH RECOMPILE,ENCRYPTION /* RECOMPILE 为存储过程指定重编译,ENCRYPTION 对包含alter proc 文本的syscomments表中的项进行加密 */ASselect orderid,customerid,orderdate,shipcountryfrom orderswhere orderdate>='1/1/1998' and shipcountry='USA'/*******************************/八、删除存储过程/*******************************/USE NorthwindGoDROP PROC my_procedure4/*******************************/九、重编译存储过程SQLServer在创建存储过程时要进行语法检查,若语法正确,则存储过程的文本将保存在syscoments系统表中,在执行存储过程时要分析该存储过程并创建执行计划,并把执行计划置于内存中,当用户改变表内数据时,可能导致原来的执行计划效率低或不可用,因此需要重新进行编译。
SQL SERVER 2008创建作者作品查询存储过程在SQL Server 2008服务器上创建作者作品查询存储过程存储,可以有效的封装重复性工作的方法,不仅支持用户声明的变量、条件执行和其他强大的编程功能,还可以使用EXECUTE语句执行存储过程。
EXECUTE语句也可以简写为EXEC。
如果将要执行的存储过程需要参数,应该在存储过程名称后面带上参数值。
本次练习通过建立两种存储过程实例,让读者掌握存储过程的具体使用方法。
1.创建一个无参数的存储过程在Pubs数据库中,创建一个查询所有作者,以及他们的文章和出版社信息的存储过程,具体代码如下:USE PubsGO--创建存储过程CREA TE PROCEDURE proc_authorInfoASSELECT au_lname,au_fname,title,pub_nameFROM dbo.authors,dbo.titles,dbo.publishers,dbo.titleauthorWHERE dbo.authors.au_id=dbo.titleauthor.au_idAND dbo.titles.title_id=dbo.titleauthor.title_idAND dbo.titles.pub_id=dbo.publishers.pub_idGO--执行EXEC proc_authorInfo执行上面的语句生成存储过程,使用EXEC语句调用存储过程“proc_authorInfo”结果如图8-1所示:图8-1 无参数存储过程执行结果2.创建带有参数的存储过程在CREA TE PROCEDURE语句中可以声明一个或多个参数。
除非定义了参数的默认值或者将参数设置为等于另一个参数,否则用户必须在调用过程时为每个声明的参数提供值,如果指定了FOR REPLICA TION,则无法声明参数。
下面根据Northwind数据库中的shippers表,制定运输号,查询该运输号的所有信息,来创建存储过程,具体代码如下:USE NorthwindGO--创建CREA TE PROCEDURE proc_In@s_id intASSELECT * FROM dbo.ShippersWHERE ShipperID=@s_id--执行EXEC proc_In 1使用EXECUTE语句调用存储过程“proc_In”需要为声明的运输号参数定义值,格式及结果如图8-2所示:图8-2 带运输号参数存储过程的执行结果。
一、实验模块数据库原理与应用二、实验标题存储过程操作实验三、实验内容1. 实验目的(1)掌握存储过程的概念和作用。
(2)学会创建和使用存储过程。
(3)了解存储过程与触发器的区别。
2. 实验原理存储过程是一组为了完成特定功能的SQL语句集,存储在数据库中供应用程序调用。
它可以提高数据库性能,简化代码编写,提高安全性。
3. 实验步骤(1)创建数据库```sqlCREATE DATABASE IF NOT EXISTS experiment;USE experiment;```(2)创建表```sqlCREATE TABLE IF NOT EXISTS employee (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50),age INT,department_id INT);CREATE TABLE IF NOT EXISTS department (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50));```(3)插入数据```sqlINSERT INTO employee (name, age, department_id) VALUES ('张三', 25, 1),('李四', 30, 2),('王五', 28, 3);INSERT INTO department (name) VALUES ('技术部'),('业务部'),('售后部');```(4)创建存储过程```sqlDELIMITER //CREATE PROCEDURE get_department_name(IN emp_id INT, OUT dept_name VARCHAR(50))BEGINSELECT INTO dept_name FROM employee e INNER JOIN department d ON e.department_id = d.id WHERE e.id = emp_id;END //DELIMITER ;```(5)调用存储过程```sqlCALL get_department_name(1, @dept_name);SELECT @dept_name AS department_name;```(6)创建触发器```sqlDELIMITER //CREATE TRIGGER before_employee_insertBEFORE INSERT ON employeeFOR EACH ROWBEGINIF NEW.age < 20 THENSIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '年龄不能小于20岁'; END IF;END //DELIMITER ;```(7)尝试插入年龄小于20岁的数据```sqlINSERT INTO employee (name, age, department_id) VALUES ('赵六', 18, 1);```4. 实验结果与分析(1)成功创建存储过程和触发器。