014.存储过程(sql实例)
--存储过程--GO--先编译,再执行
--1.GO:批处理语句,GO之前作为一个批次发送服务器编译执行
USE master
GO
CREATE DATABASE TEST_DB
GO
USE TEST_DB
CREATE TABLE TEST
(ID INT,NAME VARCHAR(10))
GO
INSERT INTO TEST VALUES
(1,'张清瑞'),
(2,'柴铭阳')
GO
--2.存储过程(PROCEDURE)
--类似于C#中的方法(封装,重用:编译1次,反复重用)
--作用:
-- 用来执行复杂的业务功能
--优点:
--<1> 效率高,执行速度快(节省了编译时间)
--<2> 减少网络流量
--<3> 安全性高
--<4> 允许在数据库中实现模块化开发
--1 sql 1000 (效率高) 一条sql语句只编译一次
--1 sql 1行 1000次 需要编译1000次,效率低
--语法 数据库对象
CREATE PROC [EDURE] name
@name1 datatype[=默认值] --in 类型参数 默认
....
@name2 datatype OUTPUT --output 向外传值 实现与return相似的功能
AS --分割存储过程的定义和存储过程体(没有软用)
过程体--t_sql
GO
---------------------------------------------------------------------案例分析-------------------------------------------------------------------------------------
--EG1: 无参的存储过程
--查看销售部(sales)的员工信息
--先编译,再调用
CREATE PROCEDURE EmpsInfo
--无参 不用写参数
--WITH ENCRYPTION --源代码加密
AS
PRINT '销售部(sales)的员工信息如下:'
SELECT * FROM EMP WHERE
DEPTNO=(SELECT DEPTNO FROM DEPT WHERE DNAME='sales')
GO
--执行存储过程
EXEC EmpsInfo--执行存储过程
--查看存储过程源代码 :
exec sp_helptext 'EmpsInfo'
ALTER PROCEDURE EmpsInfo--修改存储过程/解密
AS
PRINT '销售部(sales)的员工信息如下:'
SELECT * FROM EMP WHERE
DEPTNO=(SELECT DEPTNO FROM DEPT WHERE DNAME='sales')
GO
DROP PROCEDURE EmpsInfo--删除存存储过程
--EG2. 带有in类型参数的存储过程
--显示任意部门(参数)的员工信息
CREATE PROCEDURE EmpsInfo
@name varchar(20) --参数in,只有in类型参数有默认值
AS
PRINT @name+'部门的员工信息如下:'
SELECT * FROM EMP WHERE
DEPTNO=(SELECT DEPTNO FROM DEPT WHERE DNAME=@name)
GO
--执行存储过程有in类型
EXEC EmpsInfo @name='sales' -----KEY VALUE
EXEC EmpsInfo 'ACCOUNTING' --按顺序传参
EXEC EmpsInfo --参数会使用默认值,如果没有默认值会报错
--EG3.带有输入(in)和输出(output)两种类型参数的存储过程
--求和 int sum(int a,int b)
CREATE PROC GetSum
@a int=0,--in
@b int=0,
@sum int output --output输出类型参数
AS
SET @sum=@a+@b
GO
--执行过程
--key=value
DECLARE @s int
EXEC GetSum @b=10,@a=20,@Sum=@s output
print @s
--思考:存储过程中可以有return 语句吗?
--可以 return 中断过程执行
--return val,val只能返回的是整数.(退化很少用)
--练习:编写过程,向一个空的测试表插入任意行的数据.
--要求,一次插入的数据不能重复
CREATE TABLE DUMP
(
ID int,
NAME nvarchar(20),
PRICE money
)
CREATE PROC AddData
@rowNum int=100
AS
DECLARE @i int=1
WHILE(@i<=@rowNum)
BEGIN
INSERT INTO DUMP VALUES(@i,NEWID(),@i*0.23+5)
SET @i+1