浅谈数据库之存储过程

浅谈数据库之存储过程

什么是存储过程

如果你接触过其他的编程语言,那么就好理解了,存储过程就像是方法一样。

  竟然他是方法那么他就有类似的方法名,方法要传递的变量和返回结果,所以存储过程有存储过程名有存储过程参数也有返回值。

  存储过程的优点:   

  • 存储过程的能力大大增强了SQL语言的功能和灵活性。
  •   可保证数据的安全性和完整性。
  •   通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。
  •   通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。
  •   在运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。这种已经编译好的过程可极大地改善SQL语句的性能。
  •   可以降低网络的通信量。
  •   使体现企业规则的运算程序放入数据库服务器中,以便 集中控制。

存储过程可以分为系统存储过程、扩展存储过程和用户自定义的存储过程

系统存储过程

我们先来看一下系统存储过程,系统存储过程由系统定义,主要存放在MASTER数据库中,名称以"SP"开头或以"XP"开头。尽管这些系统存储过程在MASTER数据库中,

   但我们在其他数据库还是可以调用系统存储过程。有一些系统存储过程会在创建新的数据库的时候被自动创建在当前数据库中。

常用系统存储过程有:

  • exec sp_databases; --查看数据库
  • exec sp_tables;        --查看表
  • exec sp_columns student;--查看列
  • exec sp_helpIndex student;--查看索引
  • exec sp_helpConstraint student;--约束
  • exec sp_helptext ‘sp_stored_procedures‘;--查看存储过程创建定义的语句
  • exec sp_stored_procedures;
  • exec sp_rename student, stuInfo;--更改表名
  • exec sp_renamedb myTempDB, myDB;--更改数据库名称
  • exec sp_defaultdb ‘master‘, ‘myDB‘;--更改登录名的默认数据库
  • exec sp_helpdb;--数据库帮助,查询数据库信息
  • exec sp_helpdb master;
  • exec sp_attach_db --附加数据库
  • exec sp_detach_db --分离数据库

存储过程语法:

在创建一个存储过程前,先来说一下存储过程的命名,看到好几篇讲存储过程的文章都喜欢在创建存储过程的时候加一个前缀,养成在存储过程名前加前缀的习惯很重要,虽然这只是一件很小的事情,但是往往小细节决定大成败。看到有的人喜欢这样加前缀,例如proc_名字。也看到这加样前缀usp_名字。前一种proc是procedure的简写,后一种sup意思是user procedure。我比较喜欢第一种,那么下面所有的存储过程名都以第一种来写。至于名字的写法采用骆驼命名法。

创建存储过程的语法如下:

CREATE PROC[EDURE] 存储过程名 

@参数1 [数据类型]=[默认值] [OUTPUT] 

@参数2 [数据类型]=[默认值] [OUTPUT]

AS 

SQL语句

EXEC 过程名[参数]

使用存储过程实例:

1.不带参数

create procedure proc_select_officeinfo--(存储过程名)
as select Id,Name from Office_Info--(sql语句)

exec proc_select_officeinfo--(调用存储过程)

2.带输入参数

create procedure procedure_proc_GetoffinfoById --(存储过程名)
@Id int--(参数名 参数类型)
as select Name from dbo.Office_Info where [email protected](sql语句)

exec procedure_proc_GetoffinfoById 2--(存储过程名称之后,空格加上参数,多个参数中间以逗号分隔)

注:参数赋值是,第一个参数可以不写参数名称,后面传入参数,需要明确传入的是哪个参数名称

3.带输入输出参数

create procedure proc_office_info--(存储过程名)
@Id int,@Name varchar(20) output--(参数名 参数类型)传出参数要加上output
as
begin
select @Name=Name from dbo.Office_Info where [email protected] --(sql语句)
end

declare @houseName varchar(20) --声明一个变量,获取存储过程传出来的值
exec proc_office_info--(存储过程名)
4,@houseName output--(传说参数要加output 这边如果用@变量 = OUTPUT会报错,所以换一种写法)

select @houseName--(显示值)

4.带返回值的

create procedure proc_office_info--(存储过程名)
@Id int--(参数名 参数类型)
as
begin
if(select Name from dbo.Office_Info where [email protected])=null --(sql语句)
begin
return -1
end
else
begin
return 1
end
end

declare @house varchar(20) --声明一个变量,获取存储过程传出来的值
exec @house=proc_office_info 2 --(调用存储过程,用变量接收返回值)
--注:带返回值的存储过程只能为int类型的返回值
print @house
时间: 2024-10-11 22:44:30

浅谈数据库之存储过程的相关文章

浅谈数据库设计

浅谈数据库设计 数据库设计的重要性:好的数据库设计有下面的一些作用: 1.首先充分体现系统的需求,数据库是为应用服务的,好的数据库设计应该首先能满足应用系统的业务需求,准确的表达数据间关系. 2.保证数据的准确性和一致性,通过主外键.非空.限制.唯一索引等保证数据的健壮. 3.提高数据的查询效率,通过合理表结构,安排物理存储分区.增加索引等方式,提高数据的读取速度,提高查询效率. 4.有好的扩展性,在必要时能根据需求扩展数据结构. 在系统设计中对数据库的设计应考虑哪些设计原则  数据库是整个软件

浅谈数据库框架,见笑,请多指正

浅谈数据库框架,见笑,请多指正 http://weibo.com/p/1001603724746155003486 一友说"插件式存储又割裂了SQL引擎的完整逻辑...总体而言在现有框架下MySQL的优化器没有多大改进的价值". 我们且做个技术分析: 1 插件式框架,可以静态/动态加载组件,方便在同类不同属家的模块间切换,这种设计是良好的. 很多软件的设计都采用了"微内核+插件"这样的方式构筑了强大的应用.如Ecplise生态圈. 2 数据库范围内, MySQL的属

浅谈数据库去重

关于sql去重,我简单谈一下自己的简介,如果各位有建议或有不明白的欢迎多多指出.推荐网址:www.4-yecao.com 关于sql去重最常见的有两种方式:DISTINCT和ROW_NUMBER(),当然了ROW_NUMBER()除了去重还有很多其他比较重要的功能,一会我给大家简单说说我自己在实际中用到的. 假如有张UserInfo表,如下图: 现在我们要去掉完全重复的数据:SELECT DISTINCT * FROM dbo.UserInfo结果如下图: 但是现在有个新的需求,要把名字为‘张三

浅谈数据库设计技巧(转)

说到数据库,我认为不能不先谈数据结构.1996年,在我初入大学学习计算机编程时,当时的老师就告诉我们说:计算机程序=数据结构+算法.尽管现在的程序开发已由面向过程为主逐步过渡到面向对象为主,但我还是深深赞同8年前老师的告诉我们的公式:计算机程序=数据结构+算法.面向对象的程序开发,要做的第一件事就是,先分析整个程序中需处理的数据,从中提取出抽象模板,以这个抽象模板设计类,再在其中逐步添加处理其数据的函数(即算法),最后,再给类中的数据成员和函数划分访问权限,从而实现封装. 数据库的最初雏形据说源

浅谈数据库并发控制 - 锁和 MVCC

在学习几年编程之后,你会发现所有的问题都没有简单.快捷的解决方案,很多问题都需要权衡和妥协,而本文介绍的就是数据库在并发性能和可串行化之间做的权衡和妥协 - 并发控制机制. 如果数据库中的所有事务都是串行执行的,那么它非常容易成为整个应用的性能瓶颈,虽然说没法水平扩展的节点在最后都会成为瓶颈,但是串行执行事务的数据库会加速这一过程:而并发(Concurrency)使一切事情的发生都有了可能,它能够解决一定的性能问题,但是它会带来更多诡异的错误. 引入了并发事务之后,如果不对事务的执行进行控制就会

浅谈数据库的锁

数据库对于程序猿来 并不陌生,但是数据库的锁你知道多少?数据库的锁直接影响数据性能,在大并发的前提下,怎么保证数据不被死锁,提高数据库性能?如何加锁,何时加锁,加什么锁,你可以通过hint手工强行指定,但大多是数据库系统自动决定的.这就是为什么我们可以不懂锁也可以写SQL. 下面我们来简单谈一谈数据库中的锁,以sqlserver 为例: 数据库锁的种类: 1.共享锁(Shared lock) 何为共享锁,顾名思义意思就是资源共享,所以共享锁之间 是没有时间等待的可以同时执行一条或多条查询语句,共

浅谈数据库中的存储过程

一.存储过程与函数的区别: 1.一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强. 2.对于存储过程来说可以返回参数(output),而函数只能返回值或者表对象. 3.存储过程一般是作为一个独立的部分来执行,而函数可以作为查询语句的一个部分来调用,由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面. 二.存储过程的优点: 1.执行速度更快 – 在数据库中保存的存储过程语句都是编译过的 2.允许模块化程序设计 – 类似方法的复用 3.提高系统安全性 –

数据库——浅谈数据库中的存储过程(转)

一.存储过程与函数的区别: 1.一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强. 2.对于存储过程来说可以返回参数(output),而函数只能返回值或者表对象. 3.存储过程一般是作为一个独立的部分来执行,而函数可以作为查询语句的一个部分来调用,由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面. 二.存储过程的优点: 1.执行速度更快 – 在数据库中保存的存储过程语句都是编译过的 2.允许模块化程序设计 – 类似方法的复用 3.提高系统安全性 –

浅谈数据库中的触发器

触发器 其是一种特殊的存储过程.一般的存储过程是通过存储过程名直接调用,而触发器主要是 通过事件(增.删.改)进行触发而被执行的.其在表中数据发生变化时自动强制执行. 常见的触发器有两种:after(for).instead of,用于insert.update.delete事件. after(for)        表示执行代码后,执行触发器 instead of        表示执行代码前,用已经写好的触发器代替你的操作 触发器语法: create trigger 触发器的名字   on