面试题sql的存储过程
什么是存储过程?分为哪几类?
答:存储过程是SQL语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。
1.使用存储过程有什么好处?
答:优点:(1)提供安全机制(2)改进了执行性能(3)减少网络流量(4)允许模块化程序设计
⑵ sql 中的存储过程谁能描述下下··谢谢
标准答案:
在最新的SQL2005中的存储过程(Procere)类似于java语言中的方法,它是SQL语句和控制流语句的预编译集合。存储过程在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量,逻辑控制语句以及其他强大的编程功能。
存储过程可包含逻辑控制语句和数据操作语句,它可以接收参数,输出参数,返回单个或多个结果集以及返回值。
给你一个例子:
create proc proc_takeMoney
@cardID1 varchar(20), --汇款账号
@pwd int , --汇款密码
@takeMoney money, --汇款金额
@cardID2 varchar(20) --存款账号
as
set nocount on
declare @err int
set @err = 0
if exists(select 1 from cardInfo where cardID = @cardID1 and pass = @pwd)
begin
begin tran --事物开始
update cardInfo set balance = balance + @takeMoney where cardID = @cardID2 --接受款帐户加上@takeMoney
set @err = @err + @@error
update cardInfo set balance = balance - @takeMoney where cardID = @cardID1 --汇款帐户减去@takeMoney
set @err = @err + @@error
/*--交易信息表插入交易信息--*/
insert into transInfo(transDate,cardId,transType,transMoney) values(default,@cardID1,'支取',@takeMoney)
set @err = @err + @@error
insert into transInfo(transDate,cardId,transType,transMoney) values(default,@cardID2,'存入',@takeMoney)
set @err = @err + @@error
/*--交易信息--*/
select top 2 * from transInfo order by transDate desc
if(@err<>0)
begin
rollback tran --错误回滚事物
end
else
begin
commit tran --无错误提交事物
end
end --if结束
else
begin
print '密码错误'
end
/*--调用存储过程--*/
declare @cardID1 varchar(20),@cardID2 varchar(20),@pwd int ,@takeMoney money
set @cardID1 ='1010 3576 1234 5678' --张三卡号
set @pwd = 888888 --张三密码
set @cardID2 ='1010 3576 1212 1134' --李四卡号
set @takeMoney =20 --汇款金额
exec proc_takeMoney @cardID1 ,@pwd,@takeMoney,@cardID2
⑶ 求:存储过程面试题!
其实存储过程的基本写法我相信你都知道了。
面试这种语言不要紧张,估计多数是要考你对sql效率概念的理解。
普通的sql语句谁都会写的,但是这样的语句往往会造成程序的低效,在压力比较大的服务器上,很有可能造成系统的瘫痪。
注意几点:
1、写语句要用到索引
2、not exists 替换 not in
3、exists 替换 in
4、尽量不要用3个表以上的连接,宁可单个单个取
5、注意书写规则,要写的明白写,错误信息返回那个地方要注意
6、写游标的话,要注意有退出的地方和关闭游标。
7、变量之间要注意转换,隐式的转换往往会耗掉更多的时间。
这些是最基本的了,你需要查阅相关资料进行了解下。
⑷ 什么是SQL的存储过程
sql存储过程说简单点就是一个在t-sql下用户可以自行定义的函数,
但是与一般的函数也有不同的地方,比如它的返回值只能return(int类型),如果你要输出什么信息的话只能用output.这也是存储过程的一个特色吧,设定的参数可以有输出。讲起来有点抽象,给你个例子看看吧!
首先创建一个存储过程
create
procere
cunchuguocheng
@a
int,
@b
int,
@c
int
output
as
begin
select
@c
=
@a+@b
return(0)
end
然后调用这个存储过程
declare
@value
int,
--返回值
@c
int
--结果值
exec
@value
=
cunchuguocheng
2,2,@c
output
select
@value
as
返回值
select
@c
as
结果值
程序写的很简单,你运行一下我想你就会对存储过程有所了解了。
⑸ SQL 中存储过程怎么使用
一、简单的储存过程:
1、创建一个存储过程
create procere GetUsers()
begin
select * from user;
end;12345
2、调用存储过程
call GetUsers();12
3、删除存储过程
drop procere if exists GetUsers;
二、带参数的存储过程
1、MySql 支持 IN (传递给存储过程) , OUT (从存储过程传出) 和 INOUT (对存储过程传入和传出) 类型的参数 , 存储过程的代码位于 BEGIN 和 END 语句内 , 它们是一系列 SQL 语句 , 用来检索值 , 然后保存到相应的变量 (通过指定INTO关键字) ;
2、下面的存储过程接受三个参数 , 分别用于获取用户表的最小 , 平均 , 最大分数 , 每个参数必须具有指定的类型 , 这里使用十进制值(decimal(8,2)) , 关键字 OUT 指出相应的参数用来从存储过程传出
create procere GetScores(
out minScore decimal(8,2),
out avgScore decimal(8,2),
out maxScore decimal(8,2)
)
begin
select min(score) into minScore from user;
select avg(score) into avgScore from user;
select max(score) into maxScore from user;
end;1234567891011
3、调用此存储过程 , 必须指定3个变量名(所有 MySql 变量都必须以@开始) , 如下所示 :
call GetScores(@minScore, @avgScore, @maxScore);12
4、该调用并没有任何输出 , 只是把调用的结果赋给了调用时传入的变量@minScore, @avgScore, @maxScore, 然后即可调用显示该变量的值 :
select @minScore, @avgScore, @maxScore;
5、使用 IN 参数 , 输入一个用户 id , 返回该用户的名字 :
create procere GetNameByID(
in userID int,
out userName varchar(200)
)
begin
select name from user
where id = userID
into userName;
end;12345678910
6、调用存储过程 :
call GetNameByID(1, @userName);
select @userName;123
⑹ SQL语句高手进,关于一个比较复杂的存储过程
题目所述功能要求,可以用一句SQL语句实现,当然如果要传递一些参数地滤的话还是需要存储过程.
语句思路:
1.按dwbh,时间汇总个人表中金额
2.按dwbh,时间汇总单位表中金额
3.将以上两个汇总结果进行关联,关联的条件是相同dwbh、相同时间情况下金额不同的记录.即可以实现金额不相同的数据筛选出来.
"--"符号为注解,以下语句中的中文字段为假想字段,可以替换为实际字段.关键在于理解语句思路.语句如下:
select
GR.dwbh
,
GR.个人表交费时间
as
时间,GR.个人交费总金额,DW.单位交费总金额,(GR.个人交费总金额
-
DW.单位交费总金额)
as
差额
from
(
select
dwbh,个人表交费时间,sum(交费金额)
as
个人交费总金额
--子查询汇总出个人交费表中的单位、时间、金额,并取别名为GR嵌入From子句中
from
bcd
group
by
dwbh,交费时间
)
as
GR
inner
join
--
将上下两个子查询进行内联
(
select
dwbh,单位表交费时间,sum(交费金额)
as
单位交费总金额
--子查询汇总出单位交费表中的单位、时间、金额,并取别名为DW嵌入From子句中
from
abc
groub
by
dwbh,交费时间
)
as
DW
on
GR.dwbh
=
DW.dwbh
and
GR.个人表交费时间
=
DW.单位表交费时间
and
GR.个人交费总金额
<>
DW.单位交费总金额
--两个子查询内联的条件是单位编号相同,时间相同,但金额不同的记录
⑺ SQL中存储过程是干什么用的
存储过程是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。
数据库存储过程的实质就是部署在数据库端的一组定义代码以及SQL。将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来,那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。
每个参数名前要有一个“@”符号,每一个存储过程的参数仅为该程序内部使用,参数的类型除了IMAGE外,其他SQL Server所支持的数据类型都可使用。
(7)面试题sql的存储过程扩展阅读:
SQL中存储过程优点:
1、重复使用。存储过程可以重复使用,从而可以减少数据库开发人员的工作量。
2、减少网络流量。存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量。
3、安全性。参数化的存储过程可以防止SQL注入式攻击,而且可以将Grant、Deny以及Revoke权限应用于存储过程。
4、存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。