简单sql存储过程实例、储过程实战
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单sql存储过程实例、储过程实战相关的知识,希望对你有一定的参考价值。
参考技术A 实例1:只返回单一记录集的存储过程。银行存款表(bankMoney)的内容如下
Id
userID
Sex
Money
001
Zhangsan
男
30
002
Wangwu
男
50
003
Zhangsan
男
40
要求1:查询表bankMoney的内容的存储过程
create
procedure
sp_query_bankMoney
as
select
*
from
bankMoney
go
exec
sp_query_bankMoney
注*
在使用过程中只需要把中的SQL语句替换为存储过程名,就可以了很方便吧!
实例2(向存储过程中传递参数):
加入一笔记录到表bankMoney,并查询此表中userID=
Zhangsan的所有存款的总金额。
Create
proc
insert_bank
@param1
char(10),@param2
varchar(20),@param3
varchar(20),@param4
int,@param5
int
output
with
encryption
---------加密
as
insert
bankMoney
(id,userID,sex,Money)
Values(@param1,@param2,@param3,
@param4)
select
@param5=sum(Money)
from
bankMoney
where
userID='Zhangsan'
go
在SQL
Server查询分析器中执行该存储过程的方法是:
declare
@total_price
int
exec
insert_bank
'004','Zhangsan','男',100,@total_price
output
'总余额为'+convert(varchar,@total_price)
go
在这里再啰嗦一下存储过程的3种传回值(方便正在看这个例子的朋友不用再去查看语法内容):
1.以Return传回整数
2.以output格式传回参数
3.Recordset
传回值的区别:
output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中。
实例3:使用带有复杂
SELECT
语句的简单过程
下面的存储过程从四个表的联接中返回所有作者(提供了姓名)、出版的书籍以及出版社。该存储过程不使用任何参数。
USE
pubs
IF
EXISTS
(SELECT
name
FROM
sysobjects
WHERE
name
=
'au_info_all'
AND
type
=
'P')
DROP
PROCEDURE
au_info_all
GO
CREATE
PROCEDURE
au_info_all
AS
SELECT
au_lname,
au_fname,
title,
pub_name
FROM
authors
a
INNER
JOIN
titleauthor
ta
ON
a.au_id
=
ta.au_id
INNER
JOIN
titles
t
ON
t.title_id
=
ta.title_id
INNER
JOIN
publishers
p
ON
t.pub_id
=
p.pub_id
GO
au_info_all
存储过程可以通过以下方法执行:
EXECUTE
au_info_all
实例4:使用带有参数的简单过程
CREATE
PROCEDURE
au_info
@lastname
varchar(40),
@firstname
varchar(20)
AS
SELECT
au_lname,
au_fname,
title,
pub_name
FROM
authors
a
INNER
JOIN
titleauthor
ta
ON
a.au_id
=
ta.au_id
INNER
JOIN
titles
t
ON
t.title_id
=
ta.title_id
INNER
JOIN
publishers
p
ON
t.pub_id
=
p.pub_id
WHERE
au_fname
=
@firstname
AND
au_lname
=
@lastname
GO
au_info
存储过程可以通过以下方法执行:
EXECUTE
au_info
'Dull',
'Ann'
--
Or
EXECUTE
au_info
@lastname
=
'Dull',
@firstname
=
'Ann'
--
Or
EXECUTE
au_info
@firstname
=
'Ann',
@lastname
=
'Dull'
实例5:使用带有通配符参数的简单过程
CREATE
PROCEDURE
au_info2
@lastname
varchar(30)
=
'D%',
@firstname
varchar(18)
=
'%'
AS
SELECT
au_lname,
au_fname,
title,
pub_name
FROM
authors
a
INNER
JOIN
titleauthor
ta
ON
a.au_id
=
ta.au_id
INNER
JOIN
titles
t
ON
t.title_id
=
ta.title_id
INNER
JOIN
publishers
p
ON
t.pub_id
=
p.pub_id
WHERE
au_fname
LIKE
@firstname
AND
au_lname
LIKE
@lastname
GO
au_info2
存储过程可以用多种组合执行。下面只列出了部分组合:
EXECUTE
au_info2
--
Or
EXECUTE
au_info2
'Wh%'
--
Or
EXECUTE
au_info2
@firstname
=
'A%'
--
Or
EXECUTE
au_info2
'[CK]ars[OE]n'
--
Or
EXECUTE
au_info2
'Hunter',
'Sheryl'
--
Or
EXECUTE
au_info2
'H%',
'S%'
MySQL之存储过程实例讲解(创建调用查看修改删除)
1、存储过程简介:
存储过程,英文名Stored Procedure,说简单点,就是将MySQL语句集或必要的程序封装在一个结构体里面,存储在数据库中,供外部调用的一个数据库对象,存储过程在思想上很简单,就是SQL代码的封装与重用。
优点
- 存储过程可封装,并隐藏复杂的商业逻辑。
- 存储过程可以回传值,并可以接受参数。
- 存储过程可以返回多个值,而普通函数只能返回一个值。
- 存储过程无法使用 SELECT 指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同。
- 存储过程可以用在数据检验,强制实行商业逻辑等。
缺点
- 存储过程,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。
- 存储过程的性能调校与撰写,受限于各种数据库系统。
2、学习前准备(主题引出)
创建一张简单表名为table1,仅有一个列name;
SQL语句:create table table1(name varchar(10));
再创建两张表运动员和赛事情况表;
SQL语句-运动员表:
create table Players(
id int(10) Auto_Increment Not null Primary Key,
name varchar(20) Not null,
age varchar(4) not null,
gender varchar(4))Engine=InnoDB Auto_increment=1 Default Charset=utf8;
SQL语句-赛事情况表:
create table Matches(
id int(10) Auto_Increment Not null,
MATCHNO int(5) Not null,
TEAMNO Varchar(6) not Null,
PLAYERNO int(7) Not null ,
WON Int(8) not null,
LOST varchar(2),
Primary Key(id))Engine=InnoDB Auto_increment=1 default Charset =utf8;
向三张表插入数据:
insert into table1 values(78);insert into table1 values(‘ls‘);
insert into players values(1,‘lsq‘,22,‘男‘);insert into Players values(2,‘lqq‘,23,‘女‘);
insert into Matches values(1,5,6,3,8,9); insert into Matches values(2,2,3,4,3,8);
注意:小细节,关于SQL语句结构体是不分大小写的,但表名必须区分大小写,我用的Mysql版本是8.0后的版本。
这些语句我们可以写成存储语句,外部调用,一次性执行。
存储过程语句:
CREATE PROCEDURE first_proc()
BEGIN
DECLARE x VARCHAR(20) DEFAULT ‘‘;
DECLARE y VARCHAR(20) DEFAULT ‘‘;
DECLARE z VARCHAR(20) DEFAULT ‘‘;
DECLARE m VARCHAR(20) DEFAULT ‘‘;
DECLARE n VARCHAR(20) DEFAULT ‘‘;
DECLARE o VARCHAR(20) DEFAULT ‘‘;
DECLARE p VARCHAR(20) DEFAULT ‘‘;
drop table table1;
drop table Players;
drop table Matches;
select x;
set y=‘创建第一张table1‘;
select y;
create table table1(name varchar(10));
set z=‘创建第二张表Players‘;
select z;
create table Players(
id int(10) Auto_Increment Not null Primary Key,
name varchar(20) Not null,
age varchar(4) not null,
gender varchar(4))Engine=InnoDB Auto_increment=1 Default Charset=utf8;
set m=‘创建第三张表‘;
select m;
create table Matches(
id int(10) Auto_Increment Not null,
MATCHNO int(5) Not null,
TEAMNO Varchar(6) not Null,
PLAYERNO int(7) Not null ,
WON Int(8) not null,
LOST varchar(2),
Primary Key(id))Engine=InnoDB Auto_increment=1 default Charset =utf8;
set n=‘向表中插入数据‘;
select n;
insert into table1 values(78);insert into table1 values(‘ls‘);
insert into Players values(1,‘lsq‘,22,‘男‘);insert into Players values(2,‘lqq‘,23,‘女‘);
insert into Matches values(1 ,5,6,3,8,9); insert into Matches values(2,2,3,4,3,8);
set o=‘下面是每张表的详细信息‘;
select z;
select * from table1;
select * from Players;
select * from Matches;
set p=‘结束‘;
select p;
end;
//
Delimiter ;
call first_proc;
声明语句结束符,可以自定义:
DELIMITER $$
或
DELIMITER //
其他任意符号都行,结构体写完,推荐都用";" 习惯了。
声明存储过程:
CREATE PROCEDURE proc_name(IN p_in int)
存储过程开始和结束符号:
BEGIN .... END
变量定义:
DECLARE num int unsigned default 100;
Declare char_1 varchar(10) default ‘‘;
变量赋值:
set num=23;
set char_1=‘我是齐天大圣‘;
存储过程结构体:
存储过程体包含了在过程调用时必须执行的语句,例如:dml、ddl语句,if-then-else和while-do语句、声明变量的declare语句等
过程体格式:以begin开始,以end结束(可嵌套)
BEGIN
BEGIN
BEGIN
statements;
END
END
END
- IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
- OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
- INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
Delimiter //
Create Procedure proc_in(In p_in varchar(20))
Begin
select p_in;
insert into table1 values(p_in);
select * from table1;
set p_in=‘我是牛魔王‘;
select p_in;
End;
//
Delimiter ;
set @p_in=‘我是齐天大圣‘;
call proc_in(@p_in);
设置传入参数值:
调用存储过程: 可以看到外部参数被传进存储过程体,然后再插入table1表中,接着在结构体内更改了变量。
例2:结构体内部参数传到外面
Create Procedure proc_out(Out p_out varchar(20))
Begin
select p_out;
set p_out=‘我是牛魔王‘;
//
Delimiter ;
set @p_out=‘我是太白金星‘;
call proc_out(@p_out);
调用存储过程:可以看出“太白金星”并没有被传到存储过程结构体中。
select @p_out;
结果是结构体中返回的变量“牛魔王”。
例3:既能输入也能输出
其中,datatype 为 MySQL 的数据类型,如: int, float, date,varchar(length)
例如:
CREATE PROCEDURE GreetWorld1() SELECT CONCAT(@greeting,‘ World‘) As "hello world";
SET @greeting=‘Hello‘;
CALL GreetWorld1( );
在MySQL客户端使用存储变量:读者自行测试
SELECT ‘Hello World‘ into @x;
SELECT @x;
SET @y=‘Goodbye Cruel World‘;
SELECT @y;
SET @z=1+2+3;
SELECT @z;
在存储过程间传递全局范围的用户变量:不推荐,滥用变量会导致难以理解和管理
CREATE PROCEDURE p1() SET @last_procedure=‘p1‘;
CREATE PROCEDURE p2() SELECT CONCAT(‘Last procedure was ‘,@last_procedure);
CALL p1( );
CALL p2( );
4.3、存储过程查看
select routine_name from information_schema.routines where routine_schema=‘数据库名‘;
show procedure status where db=‘shop‘;
show create procedure first_proc; #表示查看创建存储过程的语句
characteristic:
COMMENT ‘string‘
|LANGUAGE SQL
| CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA
|SQL SECURITY DEFINER | INVOKER
存储过程的特征characteristic:指定存储的特性
1、COMMENT ‘string‘是注释信息;
LANGUAGE SQL是指明过程体是用sql语言编写的,而不是java或php;
2、SQL SECURITY DEFINER | INVOKER 指明谁有权限来执行:
DEFINER表示只有定义者自己才能够执行;
INVOKER表示调用者可以执行。
以上是关于简单sql存储过程实例、储过程实战的主要内容,如果未能解决你的问题,请参考以下文章