❶ 数据库实验报告
表建得不合理,不符合数据库规范化要求,课程并不是由学号所决定了,课程可作为一个独立的表,还有,成绩是有学号和课程号共同决定的,因此成绩表也应该列出来作为一个独立的表。
应该分为3个表来建立数据库
1、学生信息表(学号,姓名,性别,出生日期,联系电话)
2、课表(课程号,课程名)
3、成绩表(学号,课程号,成绩)
期中学号是学生表的主键,课程号是课表的主键,学号和课程号组合是成绩表的主键,两者共同决定成绩。
拆分出来后,避免了数据冗余的问题,消除专递依赖!
完整性参照很简单,你自己解决吧。
❷ 数据库存储过程有哪些,面试题
数据库存储过程有哪些
/*
系统存储过程很多,有些常用,有些不常用
常用:
sp_attach_db 附加数据库到一个服务器中
sp_columns 返回在当前环境中列的信息
sp_databases 列出当前系统中的数据库
sp_configure 显示或修改当前服务器的全局配置
sp_depends 显示数据库对象的依赖信息
sp_executesql 执行动态的T-SQL语句
sp_help 报告有关数据库对象的信息
sp_helpdb 返回指定数据库或全部数据库的信息
sp_helptext 显示规则、默认值、存储过程、触发器、视图等的未加密的文本定义信息
sp_indexes 返回指定远程表的索引信息
sp_lock 返回有关锁的信息
sp_password 增加或者修改指定login的口令
sp_rename 更改用户创建的数据库对象名称
sp_renamedb 更改数据库名称
sp_spaceused 显示数据库的空间使用情况
sp_tables 返回在当前环境中可以被查询的对象的列表
sp_who 提供当前用户和进程的信息
不常用:
sp_addlinkedserver 创建一个允许执行分布式查询的链接服务器
sp_addlinkedsrvlogin 在本地服务器和远程服务器之间创建login帐户的映射关系
sp_addlogin 创建一个新的login帐户
sp_add_agent_parameter 在代理文件中增加一个参数
sp_add_agent_profile 为复制代理增加一个代理文件
sp_add_alert 创建一个警报
sp_add_category 在服务器上,增加一种作业、警报或者操作员的特定分类
sp_add_data_file_recover_suspect_db 当数据库复原不能完成时,向文件组增加一个数据文件
sp_add_file_recover_suspect_db 对于复原有问题的数据库增加一个文件
sp_add_job 增加一个sql server agent可以执行的作业
sp_add_jobschele 为作业创建调度
sp_add_jobserver 把指定的作业增加到指定服务器上
sp_add_jobstep 在作业中增加一步或一个操作
sp_add_log_file_recover_suspect_db 当数据库复原不能完成时,向文件组增加一个日志文件
sp_add_notification 为警报创建一个通知
sp_add_operator 为警报或者作业创建一个操作员
sp_add_targetservergroup 增加指定的服务器组
sp_add_targetsvrgrp_member 在指定的目标服务器组增加一个目标服务器
sp_addalias 在数据库中为login帐户增加一个别名
sp_addapprole 在数据库中增加一个特殊的应用程序角色
sp_addarticle 创建文章,并把该文章添加到出版物中
sp_adddistpublisher 创建一个使用本地分布服务器的出版服务器
sp_adddistributiondb 在分布服务器上创建一个新的distribution数据库
sp_adddistributor 增加一个分布服务器
sp_addextendedproc 在系统中增加一个扩展存储过程
sp_addgroup 在当前数据库中增加一个组
sp_addmergearticle 为一个已有的合并出版物创建一个文章
sp_addmergefilter 为了连接另外一个表,创建一个合并过滤器
sp_addmergepublication 创建一个新的合并出版物
sp_addmergepullsubscription 增加一个拉回类型的订阅物
sp_addmergepullsubscription_agent 在订阅服务器上,为合并拉回订阅物创建一个代理
sp_addmergesubscription 创建一个推出或者拉回类型的订阅物
sp_addmessage 在系统中增加一个新的错误消息
sp_addpublicaton 创建一个快照复制或者事务复制出版物
sp_addpublicaton_snapshot 创建一个快照代理
sp_addpullsusscription 在当前订阅服务器的数据库中增加一个拉回或者匿名订阅物
sp_addpullsusscription_agent 在订阅服务器的数据库中增加一个新的代理
sp_addremotelogin 在本地服务器上增加一个远程login帐户,允许执行远程存储过程调用
sp_addrole 在当前数据库中增加一个角色
sp_addrolemember 为当前数据库中的一个角色增加一个安全性帐户
sp_addserver 添加一个远程或者本地服务器
sp_addsrvrolemember 为固定的服务器角色增加一个成员
sp_addsubscriber 增加一个新的订阅服务器
sp_addsubscriber_schele 为分布代理和合并代理增加一个调度
sp_addsubscription 订阅文章并且设置订阅服务器的状态
sp_addsynctrigers 在订阅服务器上创建一个立即修改触发器
sp_addtabletocontents 在合并跟踪表中插入一个参考
sp_addtype 创建一个用户定义的数据类型
sp_admpdevice 增加一个备份设备
sp_adser 在当前数据库中为一个新用户增加一个安全性帐户
sp_altermessage 修改错误信息的状态
sp_addly_job_to_targets 把作业应用到一个或者多个目标服务器
sp_approlepassword 在当前数据库中改变应用程序角色的口令
sp_aarticle_validation 为指定的文章初始化确认请求
sp_aarticlecolumn 指定在文章中使用的列
sp_aarticlefilter 创建一个用于水平过滤数据的过滤器
sp_articleview 当表被过滤时,为文章创建一个同步化对象
sp_attach_single_file_db 在当前服务器中,附加一个只有一个数据文件的数据库
sp_aautostats 对于一个指定的索引或统计,自动显示update statistics的状态
sp_bindefault 把默认值绑定到列或用户定义的数据类型上
sp_bindrule 把规则绑定到列或用户定义的数据类型上
sp_bindsession 绑定或解除绑定与实例中的其它事务的连接
sp_browsereplcmds 在分布数据库中返回一种可读格式的结果集
sp_catalogs 返回指定连接服务器中的系统目录列表,在本地服务器中等价于数据库列表
sp_certify_removable 确认在可移动介质上用于分布的数据库是否正确配置
sp_change_agent_parameter 修改复制代理配置使用的参数
sp_change_agent_profile 修改复制代理配置使用的配置参数
sp_change_users_login 修改login与当前数据库中用户之间的关系
sp_changearticle 改变文章的属性
sp_changedbowner 改变当前数据库的所有者
sp_changedistpublisher 改变分布出版服务器的属性
sp_changedistributor_password 改变分布服务器的口令
sp_changedistributor_property 改变分布服务器的属性
sp_changedistribtutiondb 改变分布数据库的属性
sp_changegroup 改变安全性帐户所属的角色
sp_changemergearticle 改变合并文章的属性
sp_changemergefilter 改变一些合并过滤器的属性
sp_changemergepublication 改变合并出版物的属性
sp_changemergepullsubscription 改变合并拉回出版物的属性
sp_changemergesubscription 改变合并的推出或者拉回出版物的属性
sp_changeobjectowner 改变对象的所有者
sp_changepublication 改变出版物的属性
sp_changesubscriber 改变用于订阅服务器的选项
sp_changesubscriber_schele 改变用于分布式代理和事务代理的订阅服务器的调度
sp_changesubstatus 改变订阅服务器的状态
sp_column_privileges 返回列的权限信息
sp_column_privileges_ex 返回在链接服务器上指定表的列的权限信息
sp_columns_ex 返回在链接服务器上列的信息
sp_create_removable 创建一个可移动介质数据库
sp_createstats 创建单列的统计信息
sp_cursor 用于请求定位更新
sp_cursor_list 报告当前打开的服务器游标属性
sp_cursorclose 关闭和释放游标
sp_cursorfetch 从游标中取出数据行
sp_cursoropen 定义与游标和游标选项相关联的 SQL 语句,然后填充游标
sp_cursoroption 用于设置各种游标选项
sp_cycle_errorlog 关闭错误日志文件重新开始错误记录
sp_datatype_info 返回当前环境支持的数据类型信息
sp_dbfixedrolepermission 显示每一个固定数据库角色的许可
sp_dboption 显示或修改数据库选项
sp_dbremove 删除数据库和与该数据库相关的所有文件
sp_defaultdb 设置登录帐户的默认数据库
sp_defaultlanguage 设置登录帐户的默认语言
sp_delete_alert 删除警报
sp_delete_backuphistory 删除备份和恢复的历史信息
sp_delete_category 删除指定类型的作业、警报和操作员
sp_delete_job 删除一个作业
sp_delete_jobschele 删除作业的调度
sp_delete_jobserver 删除指定的目标服务器
sp_delete_jobstep 从作业中删除指定的作业步骤
sp_delete_notfication 删除发送给某个操作员的所有通知
sp_delete_operator 删除操作员
sp_delete_targetserver 从可以使用的目标服务器列表中删除指定的服务器
sp_delete_targetservergroup 删除指定的目标服务器组
sp_delete_targetsvrgrp_member 从目标服务器组中删除一个目标服务器
sp_deletemergeconflictrow 删除冲突表中的记录行
sp_denylogin 防止window用户或群组连接到 sql server
sp_describe_cursor 报告服务器游标的属性
sp_describe_cursor_columns 报告在服务器游标的结果集中列的属性
sp_describe_cursor_tables 报告服务器游标参考的基表信息
sp_detach_db 分享服务器中的数据库
sp_drop_agentparameger 删除配置文件中的一个或者多个参数
sp_drop_profile 删除配置文件
sp_dropalias 删除一个帐户的别名
sp_dropapprole 删除当前数据库中的应用程序角色
sp_droparticle 从出版物中删除一篇文章
sp_dropdevice 删除数据库或者备份设备
sp_dropdistpublisher 删除出版服务器
sp_dropdistributiondb 删除分布数据库
sp_dropdistributor 删除分布服务器
sp_dropdropextendedproc 删除一个扩展存储过程
sp_dropgroup 从当前数据库中删除角色
sp_droplinkedsrvlogin 删除一个本地服务器和连接服务器的映射帐户
sp_droplogin 删除一个登录帐户
sp_dropmergearticle 从合并出版物中删除一篇文章
sp_dropmergefilter 删除一个合并过滤器
sp_dropmergepublication 删除一个合并出版物和与其相关的快照复制
sp_dropmergepullsubscription 删除一个合并拉回订购物
sp_dropmergesubscription 删除一个订阅物
sp_dropmessage 删除一个消息
sp_droppublication 删除出版物和与其相关的文章
sp_droppullsubscription 删除当前订阅服务器数据库中的订阅物
sp_dropremotelogin 删除一个远程登录帐户
sp_droprole 从当前数据库中删除一个角色
sp_droprolemember 从当前数据库中的一个角色中删除一个安全性帐户
sp_dropserver 删除一个远程或者连接服务器列表中的服务器
sp_dropsrvrolemember 从一个固定的服务器角色中删除一个帐户
sp_dropsubscriber 删除一个订阅服务器
sp_dropsubscription 删除订阅物
sp_droptype 删除一种用户定义的数据类型
sp_dropuser 从当前数据库中删除一个用户
sp_dropdropwebtask 删除以前版本定义的web任务
sp_dsninfo 从一个与当前服务器相关的分布服务器返回ODBC和OLE DB数据源的信息
sp_mpparamcmd 返回存储在分布数据库中的参数化命令的详细信息
sp_enumcodepages 返回一个字符集和代码页的列表
sp_enumcustomresovers 返回所有可用的定制解决方案表表
sp_enumdsn 返回所有可用的odbc和ole db数据源列表
sp_enumfullsubscribers 返回订阅服务器的列表
sp_expired_subscription_cleanup 周期性地检查订阅物的状态是否失效
sp_fkeys 返回当前环境的外键信息
sp_foreignkeys 返回参照连接服务器的表的主键的外键
sp_fulltext_catalog 创建和删除全文本目录
sp_fulltext_column 指定某一个列是否参加全文本索引
sp_fulltext_database 从当前数据库中初始化全文本索引
sp_fulltext_service 改变Microsoft Search Service属性
sp_fulltext_table 标记用于全文本索引的表
sp_generatefilters 在外键表上创建一个过滤器
sp_get_distributor 确定一个分布服务器是否安装在某个服务器上
sp_getbindtoken 创建一个绑定的连接文本
sp_getmergedeletype 返回合并删除的类型
sp_grant_publication_access 在出版物的访问列表中增加一个用户
sp_grantdbaccess 在当前数据库中增加一个安全性帐户
sp_grantlogin 允许Windows用户或群组连接到 SQL Server
sp_help_agent_default 检索作为参数传送的代理类型的默认配置的标识号
sp_help_agent_parameter 返回代理配置的所有参数
sp_help_agent_profile 返回指定代理的配置
sp_help_alert 报告有关警报的信息
sp_help_category 提供有关作业、警报、操作员的指定种类的信息
sp_help_downloadlist 列出有关作业的信息
sp_help_fulltext_catalogs 返回有关全文本索引表的信息
sp_help_fulltext_columns 返回标记全文本索引的列信息
sp_help_fulltext_columns_cursor 使用游标检索标记为全文本的索引列
sp_help_fulltext_tables 返回标记为全文本索引的表
sp_help_fulltext_tables_cursor 使用游标返回标记为全文本索引的表
sp_help_job 返回有关作业的信息
sp_help_jobhistory 提供有关作业的历史信息
sp_help_jobschele 返回作业的调度信息
sp_help_jobserver 返回给定作业的服务器信息
sp_help_jobstep 返回作业的步骤信息
sp_help_operator 返回有关操作员的信息
sp_help_publication_access 返回可以访问指定出版物的帐户列表
sp_help_targetserver 列出全部目标服务器
sp_help_targetservergroup 列出指定服务器组中的全部目标服务器
sp_helparticle 显示有关文章的信息
sp_helpconstraint 返回有关约束的类型、名称等信息
sp_helpdbfixedrole 返回固定的服务器角色的列表
sp_helpdevice 返回有关数据库文件的信息
sp_helpdistpublisher 返回充当分布服务器的出版服务器的属性
sp_helpdistributiondb 返回分布数据库的属性信息
sp_helpdistributor 列出分布服务器、分布数据库、工作目录等信息
sp_helpextendproc 显示当前定义的扩展存储过程信息
sp_helpfile 返回与当前数据库相关的物理文件信息
sp_helpfilegroup 返回与当前数据库相关的文件组信息
sp_helpgroup 返回当前数据库中的角色信息
sp_helpindex 返回有关表的索引信息
sp_helplanguage 返回有关语言的信息
sp_helplinkedsrvlogin 返回链接服务器中映射的帐户信息
sp_helplogins 返回有关login和与其相关的数据库用户信息
sp_helpmergearticle 返回有关合并文章的信息
sp_helpmergearticleconflicts 返回有关冲突的出版物中的文章信息
sp_helpmergeconflictrows 返回在指定冲突表中的行
sp_helpmergefilter 返回有关合并过滤器的信息
sp_helpmergepublication 返回有关合并出版物的信息
sp_helpmergepullsubscription 返回有关拉回订阅物的信息
sp_helpmergesubscription 返回有关推出订阅物的信息
sp_help_notification 报告对于给定操作员的警报信息
sp_helppublication 返回有关出版物的信息
sp_helprole 返回当前数据库中的角色信息
sp_helprolemember 返回当前数据库中角色成员的信息
sp_helprotect 返回有关用户许可的信息
sp_helpserver 显示特定远程或者复制服务器的信息
sp_helpsort 显示系统的排列顺序和字符集的信息
sp_helpsrvrole 显示系统中的固定服务器角色列表
sp_helpsrvrolemember 显示系统中的固定服务器角色成员的信息
sp_helpsubscrberinfo 显示有关订阅服务器的信息
sp_helpsubscription 显示有特定出版物等有关的订阅物信息
sp_helpsubscription_properties 检索安全性信息
sp_helptrigger 显示触发器的类型
sp_helpuser 显示当前数据库中的用户、Windows NT用户和组、角色等信息
sp_indexoption 为用户定义的索引设置选项
sp_link_publication 设置立即修改订阅服务器的同步化触发器使用的配置和安全性信息
sp_linkedservers 返回在本地服务器上定义的链接服务器的列表
sp_makewebtask 创建一个执行html文档的任务
sp_manage_jobs_by_login 删除或者重新指定属于login的作业
sp_mergemmyupdate 制作用于合并复制的修改备份
sp_mergesubscription_cleanup 删除元数据
sp_monitor 显示系统的统计信息
sp_msx_defect 从多个服务器操作中删除当前服务器
sp_msx_enlist 增加当前服务器到可用的目标服务器列表中
sp_pkeys 返回某个表的主键信息
sp_post_msx_operation 插入一些目标服务器可以执行的信息
sp_primarykeys 返回主键列的信息
sp_processmail 使用扩展存储过程修改邮件信息
sp_procoption 设置或者显示过程选项
sp_publication_validation 初始化文章校验请求
sp_purge_jobhistory 删除作业的历史记录
sp_recompile 使存储过程和触发器在下一次运行时重新编译
sp_refreshsubscriptions 在拉回出版物中增加订阅物到文章中
sp_refreshview 刷新指定视图的元数据
sp_reinitmergepullsubscription 标记一个合并拉回订阅
sp_reiniteergesubscription 标记一个合并订阅
sp_reinitpullsubscription 标记一个事务订阅或者匿名订阅
sp_reinitsubscription 重新初始化订阅
sp_remoteoption 显示或者修改远程登录帐户的选项
sp_remove_job_from_targets 从给定的目标服务器中删除指定的作业
sp_removedbreplication 从数据库中删除所有的复制对象
sp_replcounters 返回复制的统计信息
sp_repldone 修改服务器做的分布事务的统计信息
sp_replflush 处理文章的高速缓冲存储区
sp_replication_agent_checkup 检查每一个分布数据库
sp_replicationdboption 在当前数据库中设置复制数据库的选项
sp_replsetoriginator 用于在事务复制中检测循环登录
sp_replshowcmds 返回标记复制的事务命令
sp_repltrans 返回在出版数据库事务日志中的所有事务的结果集
sp_resetstatus 重新设置异常数据库的形态
sp_resync_targetserver 重新同步所有的多服务器作业
sp_revoke_publication_access 从出版数据库的访问列表中删除login帐户
sp_revokedbaccess 从当前数据库中删除安全性帐户
sp_revokelogin 删除系统的login帐户
sp_script_synctran_commands 生成一个可以用于立即修改订阅物的脚本
*/
❸ MySQL数据库新特性之存储过程入门教程
在MYSQL 中 终于引入了存储过程这一新特性 这将大大增强MYSQL 的数据库处理能力 在本文中 将指导读者快速掌握MYSQL 的存储过程的基本知识 带领用户入门
存储过程介绍
存储过程是一组为了完成特定功能的SQL语句集 经编译后存储在数据库中 用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它 存储过程可由应用程序通过一个调用来执行 而且允许用户声明变量 同时 存储过程可以接收和输出参数 返回执行存储过程的状态值 也可以嵌套调用
存储过程的优点
作为存储过程 有以下这些优点
( )减少网络通信量 调用一个行数不多的存储过程与直接调用SQL语句的网络通信量可能不会有很大的差别 可是如果存储过程包含上百行SQL语句 那么其性能绝对比一条一条的调用SQL语句要高得多
( )执行速度更快 存储过程创建的时候 数据库已经对其进行了一次解析和优化 其次 存储过程一旦执行 在内存中就会保留一份这个存储过程 这样下次再执行同样的存储过程时 可以从内存中直接中读取
( )更强的安全性 存储过程是通过向用户授予权限(而不是基于表) 它们可以提供对特定数据的访问 提高代码安全 比如防止 SQL注入
( ) 业务逻辑可以封装存储过程中 这样不仅容易维护 而且执行效率也高
当然存储过程也有一些缺点 比如
可移植性方面 当从一种数据库迁移到另外一种数据库时 不少的存储过程的编写要进行部分修改
存储过程需要花费一定的学习时间去学习 比如学习其语法等
在MYSQL中 推荐使用MYSQL Query Browswer()这个工具去进行存储过程的开发和管理 下面分步骤来学习MYSQL中的存储过程
定义存储过程的结束符
在存储过程中 通常要输入很多SQL语句 而SQL语句中每个语句以分号来结束 因此要告诉存储过程 什么位置是意味着整个存储过程结束 所以我们在编写存储过程前 先定义分隔符 我们这里定义 // 为分隔符 我们使用DELIMITER //这样的语法 就可以定义结束符了 当然你可以自己定义其他喜欢的符号
如何创建存储过程
下面先看下一个简单的例子 代码如下
DELIMITER//CREATEPROCEDURE`p ` ()LANGUAGE SQLDETERMINISTICSQL SECURITY DEFINERMENT A procere BEGINSELECT Hello World ! ;END//
下面讲解下存储过程的组成部分
)首先在定义好终结符后 使用CREATE PROCEDURE+存储过程名的方法创建存储过程 LANGUAGE选项指定了使用的语言 这里默认是使用SQL
)DETERMINISTIC关键词的作用是 当确定每次的存储过程的输入和输出都是相同的内容时 可以使用该关键词 否则默认为NOT DETERMINISTIC
) SQL SECURITY关键词 是表示调用时检查用户的权限 当值为INVOKER时 表示是用户调用该存储过程时检查 默认为DEFINER 即创建存储过程时检查
) MENT部分是存储过程的注释说明部分
lishixin/Article/program/MySQL/201404/30557
❹ 数据库中的存储过程到底是什么能不能举个详细的例子
存储过程,实际就是一段写在数据库中的代码。。
由于此段数据库操作代码由服务器完成,而客户端只是进行简单的参数提交,所以,可以有效的利用服务器的强劲而减小对客户机的负合。
如:你想插入一条数据到数据库。
虽然你的要求是,先检查表里面是否己存在该项。
如果不存在就Insert,如果存在就UPDATE。
这个时候,你就可以把这个判断用存储过程来写。
你的程序只要提示你想要保存到数据库里面的东西即可。
下面就是一个简单的存储过程。
CREATE
PROCEDURE
[insert_A_Employees]
(@fWorkNo
[int],
@fWorkName
[char](10),
@fDeptName
[varchar](20),
@fGroupName
[varchar](20),
@fRecordDate
[datetime])
AS
declare
@iCount
int
select
@iCount
=
count(*)
from
A_EMPLOYEES
where
@fWorkNo
=
fWORKNO
--统计该工号在数据库的数量赋值给
@iCount
if
@iCount
=
0
--如果数据库中不存在该工号
begin
INSERT
INTO
[CLKQ].[dbo].[A_Employees]
--则插入数据
(
[fWorkNo],
[fWorkName],
[fDeptName],
[fGroupName],
[fRecordDate])
VALUES
(
@fWorkNo,
@fWorkName,
@fDeptName,
@fGroupName,
@fRecordDate)
return
1
--返回一个标识
end
else
begin
--否则则更新数据
update
[CLKQ].[dbo].[A_Employees]
set
[fWorkName]=@fWorkName,
[fDeptName]=@fDeptName,
[fGroupName]=@fGroupName,
[fRecordDate]=@fRecordDate
where
[fWorkNo]=@fWorkNo
return
0
--返回一个标识
end
GO
此时你只要在客户端程序提供:
@fWorkNo
,
@fWorkName
,
@fDeptName
,
@fGroupName
,
@fRecordDate
这几个值就行了。。
其它处理过程就由服务器方处理了。
以上是以
SQL
数据库为例。。。
ACCESS
等数据库没有此功能。
❺ 实现从一个数据库往另一个数据库导数据的存储过程怎么写
是静态的数据导入,还是动态的数据?如果是静态的话,用DBLINK进行抽取插入就行,每次取数据前,先森族把要导入数据库的此锋弊那张表清基租空,然后取数据insert进去就行,如果是动态的数据,最好是写触发,做快照,然后用过程每隔一定时间去抽快照表
❻ 数据库系统原理 什么是存储过程有什么优点
存储过程也可以看成是函数的一种, 而且存储过程中的过程如果放到了开发 系统的 D 层的时候执行效果也是相同的。 存储过程是存储在数据库中的一个程序 块, 里面包含了自己定义的一段程序来实现相应的功能,比如要选择数据库的表 里面的记录,就可以使用下面的存储过程的框架:
这个实现的过程比较简单, 就是利用的是数据库自带的存储过程的模版,新 建存储过
程的时候就可以非常方便的实现自己所需要的功能。 存储过程中使用的 是数据库的语言, 跟其他的高级语言的用法相似,熟练的使用数据库的语言可以 加快开发的效率,技术也是很厉害的。 存储过程的到底有什么好处呢?一定要用存储过程吗? 存储过程的优点: 1.存储过程只在创造时进行编译,以后每次执行存储过 程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过 程可提高数据库执行速度。 2.当对数据库进行复杂操作时,可将此复杂操作用 存储过程封装起来与数据库提供的事务处理结合一起使用。更多数据库的知识, 尽在南京宝云官网。 3.存储过程可以重复使用,可减少数据库开发人员的工作量 4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权。 存储过程有利于实现一系列的操作简化,提高系统的执行效率,而且放在存 储过程中的 SQL 语句是直接在数据库中编译过了的, 系统在执行的时候就可以减 少这部分代码的资源开销。 但是对于机房重构中,有时候我们只需要更新一个记录中的某一个字段的值, 这个时候用存储过程就有点不划算了,这个时候系统如 果不用存储过程直接用 SQL 语句来说,是比较方便的。所以存储过程并不是所有 的地方用都好,凡事都有一个合适的问题,一个度的问题。 可能有的人想存储过程这么有用,而且对系统的性能有提升,那就强迫症的 都去使用存储过程。 这里又有一个问题了,存储过程的作用主要是对数据库进行 操作, 那么学过数据库系统原理的我们就需要注意一个问题了,如何防止死锁? 毫无节制的使用存储过程, 而不考虑数据库结构是不科学的。对于相同的表进行 不同的操作,所产生的结果也是不一样的,产生的顺序也是不一样的,如何在存 储过程中进行有效的操作来使系统健康强壮,这是需要注意的。 通过使用存储过程, 可以更加清晰的理解数据库和系统是如何相互关联工作 的,存储过程的使用不仅是一种技术上的提升,更是思想上的一种启发,在今后 的开发工作中是否有相同的地方需要这样的抽象封装呢。 面对更多的重复出现的 封装,我们的工作也将更加高效、简洁。
❼ 存储过程到底是什么!
在大型数据库系统中,存储过程和触发器具有很重要的作用。无论是存储过程还是触发器,都是sql 语句和流程控制语句的集合。就
本质而言,触发器也是一种存储过程。存储过程在运算时生成执行方式,所以,以后对其再运行时其执行速度很快。sql server 2000 不仅提供了用户自定义存储过程的功能,而且也提供了许多可作为工具使用的系统存储过程。
12.1.1 存储过程的概念
存储过程(stored procere)是一组为了完成特定功能的sql 语句集,经编译后存储在数据库。中用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
在sql server 的系列版本中存储过程分为两类:系统提供的存储过程和用户自定义存储过程。系统过程主要存储在master 数据库中并以sp_为前缀,并且系统存储过程主要是从系统表中获取信息,从而为系统管理员管理sql server 提供支持。通过系统存储过程,ms sql server 中的许多管理性或信息性的活动(如了解数据库对象、数据库信息)都可以被顺利有效地完成。尽管这些系统存储过程被放在master 数据库中,但是仍可以在其它数据库中对其进行调用,在调用时不必在存储过程名前加上数据库名。而且当创建一个新数据库时,一些系统存储过程会在新数据库中被自动创建。用户自定义存储过程是由用户创建并能完成某一特定功能(如查询用户所需数据信息)的存储过程。在本章中所涉及到的存储过程主要是指用户自定义存储过程。
12.1.2 存储过程的优点
当利用ms sql server 创建一个应用程序时,transaction-sql 是一种主要的编程语言。若运用transaction-sql 来进行编程,有两种方法。其一是,在本地存储transaction- sql 程序,并创建应用程序向sql server 发送命令来对结果进行处理。其二是,可以把部分用transaction-sql 编写的程序作为存储过程存储在sql server 中,并创建应用程序来调用存储过程,对数据结果进行处理存储过程能够通过接收参数向调用者返回结果集,结果集的格式由调用者确定;返回状态值给调用者,指明调用是成功或是失败;包括针对数据库的操作语句,并且可以在一个存储过程中调用另一存储过程。
我们通常更偏爱于使用第二种方法,即在sql server 中使用存储过程而不是在客户计算机上调用transaction-sql 编写的一段程序,原因在于存储过程具有以下优点:
(1) 存储过程允许标准组件式编程
存储过程在被创建以后可以在程序中被多次调用,而不必重新编写该存储过程的sql 语句。而且数据库专业人员可随时对存储过程进行修改,但对应用程序源代码毫无影响(因为应用程序源代码只包含存储过程的调用语句),从而极大地提高了程序的可移植性。
(2) 存储过程能够实现较快的执行速度
如果某一操作包含大量的transaction-sql 代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的执行计划。而批处理的transaction- sql 语句在每次运行时都要进行编译和优化,因此速度相对要慢一些。
(3) 存储过程能够减少网络流量
对于同一个针对数据数据库对象的操作(如查询、修改),如果这一操作所涉及到的 transaction-sql 语句被组织成一存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,否则将是多条sql 语句,从而大大增加了网络流量,降低网络负载。
(4) 存储过程可被作为一种安全机制来充分利用
系统管理员通过对执行某一存储过程的权限进行限制,从而能够实现对相应的数据访问权限的限制,避免非授权用户对数据的访问,保证数据的安全。(我们将在14 章“sqlserver 的用户和安全性管理”中对存储过程的这一应用作更为清晰的介绍)
注意:存储过程虽然既有参数又有返回值,但是它与函数不同。存储过程的返回值只是指明执行是否成功,并且它不能像函数那样被直接调用,也就是在调用存储过程时,在存储过程名字前一定要有exec保留字(如何执行存储过程见本章下一字)。
❽ 数据库中什么是存储过程作用是什么
存储过程,就是带有名字的一个程序块。
过程,就是程序块,说白了就是一段程序。
存储过程,创建完成之后,就存储在数据库内部了,数据库帮你记着,存储过程创建的时候都有一个名字,将来你在你的程序当中,通过某种方式(不同编程语言有不同的方式),一般来讲通过这个名字,去调用存储过程,就像使用一个方法或者函数一样,它就去做一件事!
不同的数据库的存储过程,都是用当前自己这个数据库的编程语言来编写的,比如oracle的pl/sql编程,等等。
❾ 如何查看存储过程运行到哪个语句了
存储过程(procere 过程)
SQL Server2005 的存储过程包含一些 T-SQL 语句并以特定的名称存储在数据中(存储过程也是一种数据库对象)可以在存储过程中声明变量,有条件的执行及其他各项强大的程序设计功能
SQL Server2005 的存储过程与其它育种设计语言的过程类似,同样按以下方式运行:
(1)它能够包含执行各种数据库操作的语句,并且可以调用其他的存储过程;
(2)能够接受输入参数,并以输出参数的形式将多个数据值返回给调用程序(Calling Procere)或批处理(Batch);
(3)向调用程序或批处理返回一个状态值,以表明成功或失败(以及失败的原因);
(4)存储过程(Stored Proceres) 是一组为完成特定功能的SQL 语句集,经编译后,存储在数据库中,用户通过指定存储过程的名字给出参
数(如果该存储过程带有参数)来执行它;
存储过程的类型:
一、(系统存储过程):存储过程在运行时生成执行方式,其后在运行时执行速度很
SQL Server2005 不仅提供用户自定义存储过程的功能,而且也提供许多可作为工具使用的系统存储过程;
系统存储过程(Systerm StroedProceres) 主要存储在master数据库中,并以 sp_ 为前辍,并且系统存储过程主要是从系统表中获取信息,从而为管理员SQL Server2005提供支持。通过系统存储过程SQL Server2005中的许多管理性或信息性的活动(如了解数据对象,数据库信息等)都可以被有效地完成,尽管这些系统存储过程被存储在master数据库中,但是仍然可以在其他 数据库中对其进行调用,在调用时,不必在存储过程前面加上数据库名,而且当创建一个数据库时,一些存储过程会在新的数据库中被自动创建;
系统存储过程所能完成操作很多,如提供帮助的存储过程
sp_helpsql 显示关于SQL语句,存储过程和其他主题的信息
sp_help 提供关于存储过程或其他数据库对象的报告
sp_helptext 显示存储过程和其他对象文本
sp_depends 列举引用或依赖指定对象的所有存储过程
sp_talbes 取得数据库中关于表和视图的相关信息,
sp_renameedb 更改数据库的名称
SQL Server2005系统存储过程可以使用户很容易地从系统表中提取信息,管理数据库,并执行涉及更新系统表的其他任务
系统存储过程中在master数据库中创建,由系统管理员管理,所有系统存储过程的名字均以sp_开始
如果过程以sp_前缀命名的过程在当前数据库中找不到,SQL Server2005就在master数据库中寻找,以sp_前缀命名的过程中引用的表如果不能在当前数据库中解析出来,将在master数据库查找
当前系统存储过程的参数是保留字或对象名,且对象名由数据库或拥有者名字限定时,整个名字必须包含在单引号中,一个用户可以在所有数据库中执行一个系统存储过程的许可权,否则在任何数据库中都不能执行系统存储过程
二、(本地存储过程)
本地存储过程(Local Stored Proceres)也就是用户自行创建并存储在用户数据库中的存储过程,一般所说的存储过程就是指的是本地的
用户创建的存储过程是由用户创建并能完成某一特定功能(如:查询用户所需要的数据信息)的存储过程
三、(临时存储过程)
临时存储过程(Temporary StoredProceres)可分为以下两种
1)本地临时存储过程
不论哪一个数据库是当前数据库,如果在创建存储过程时,以井字号 (#) 作为其名称的,第一个字符,则该存储过程将成为一个存放在tempdb数据库中的本地临时存放存储过程(如:CREATE PROCEDURE #book_proc) 本地临时存储过程只有创建它的连接的用户才能够执行它,而且一但这位用户断开与 sql-server的连接(也就是注销sql-server2005)本地临时存储过程就会自动删除,当然,这位用户也可以连接期间用 DROP PROCEDURE 命令删除他所创建的本地临时存储过程;
由于本地存储过程的适用范围仅限于创建它的连接,因此,不需担心其名称会和其他连接所采用的名称相同
2)全临时存储过程
不论哪一个数据库当前数据库,只要所创建的存储过程名称是以两个井字号(##)开始,则该存储过程将成为一个存储在tempdb 数据库中的全局临时存储过程(例如:create procere ##book_proc) 全局临时存储过程一旦创建,以后连接到 SQL Server2005 的任意用户都能执行它,而且不需要特定的权限
当创建全局临时存储过程的用户断开与SQL Server2005的连接时,SQL Server2005将检查是否有其他用户在执行该全局临时存储过程,如果没有,便立刻将全局临时存储过程删除,如果有SQL Server2005会让这些正在执行中的操作继续进行,但是不允许任何用户再执行全局临时存储过程,等到有未完成的操作执行完毕后,全局临时存储过程就会自动删除;
由于全局临时存储过程能够被所有的连接用户使用,因些必须注意其名称不能和其他连接所采用的名称相同
不论创建的是本地临时存储过程还是全局临时存储过程,只要SQL Server2005一停止运行,它们将不复存在;
四(远程存储过程)
在SQL Server2005 中,远程存储过程(Remote Stored Proceres)是位于远程服务器上的存储过程,通常可以使用分布式查询和 excute 命令执行一个远程存储过程;
五(扩展存储过程)
扩展存储过程(Extended Stored Proceres)是用户可以使用外部程序语言编写的存储过程,通过扩展存储过程可以弥补SQL Server2005的不足,它在使用和执行上与一般的存储过程完全相同;可以将参数传递给扩展存储过程,扩展存储过程也能够返回结果和状态值;
为了区别扩展存储过程的名称通常以xp_开头,扩展存储过程是以动态链接库(DLLS)的形式存在,能让SQL Server2005动态地装载和执行,扩展存储过程一定要存储在系统数据库 master 中
存储过程的优点
(1) 通过本地存储、代码预编译和缓存技术实现高性能的数据操作
(2) 通过用编程结构和过程实现编程框架;如果业务规则发生变化,可以通过修改存储过程来适应新的业务规则,而不必修改客户端的应用程 序,这样所有调用该存储过程的应用程序就会遵循新的业务规则;
(3) 通过隔离和加密的方法提高数据库的安全性。数据库可以通过得到权限来执行存储过程,而不必给予用户直接访问数据库对象的权限,这 些对象交收存储过程来执行操作,另外,存储过程可以加密,这样用户就无法阅读存储过程中的T-sql语句。这样做将数据库的结构和数 据库用户隔离开来,时一步保证数据的完整性和可靠性;
存储过程与视图的比较
(1) 可以在单个存储过程执行一系列T-SQL 语句,而在视图中只能是 select 语句
(2) 视图不能接受参数,只能返回结果集;而存储过程可以接受参数,包括输入,输出参数,并能返回单个或多个结果集以及返回值,这样可 大大地提高应用的灵活性;
一般来说,人们将经常用到的多个表的连接查询定义为视图,而存储过程完成复杂的一第列的处理,在存储过程中也会经常用到视图;
创建存储过程
CREATE PROCEDURE procere_name
[WITH ENCRYPTION]
[WITH RECOMPILE]
AS
Sql_statement
其中 with encryption 对存储过程进行加密; with recompile 对存储过程重新编译
例如:使用T-SQL 语句在book数据库中创建一个名为p_book1的存储过程 该存储过程返回book1表中所有出版社为"中国长安"的记录
USE book
GO
CREATE PROCEDURE p_book1
AS
SELECT * FROM book1 WHERE 出版社='中国长安'
执行存储过程
存储过程创建成功后,用户可以执行存储过程来检查存储过程的返回结果;基本语法如下:
exec procere_name
例如:使用T-SQL语句执行上面创建的存储过程 运行命令如下:
USE book
GO
exec p_book1
在运行完毕后,在SQL-Server ManagementStudio 查询窗口中返回的结果
存储过程创建成功后可以在 SQL-Server ManagementStudio 窗口中下查看存储过程的属性
例如:在 SQL-Server ManagementStudio 窗口中查看存储过程 p_book1 的属性:
对象资源管理器-> 展开book选项-> 展开可编程性-> 右击 p_book1选择修改命令 就可以修改存储过程命令属性
带参数的存储过程
由于视图没有提供参数,对于行的筛选取只能绑定在视图中定义,灵活性不大,而存储过程提供了参数,大大提高了系统开发的灵活性
向存储过程设定输入、输出参数主要目的是通过参数向存储过程输入和输出信息来扩展存储过程的功能,能过设定能数,可以多次使用同一存储过程并按要求查找所需要的结果;
1、带输入参数的存储过程
输入参数是指由调用程序向存储过程传递的参数,它们在创建存储过程语句中被定义,在执行存储过程中给出相应的变量值,为了定义输入参数存储过程,需要在 create procere 语句中声明一个或多个变量作为参数;其语法格式如下:
CREATE PROCEDURE procerd_name
@parameter_name datatype=[default]
[with encryption]
[with recompile]
AS
Sql_statement
其中各项参数如下
(1) @parameter_name: 存储过程的参数名称,必须以符号@为前缀
(2) Datatype: 参数的数据类型
(3) Default: 参数的默认值,如果执行存储过程时未提供该参数的变量值,则使用default值
例子:使用T-SQL语句在book数据表中创建一个名为p_book1p的存储过程,该存储过程能根据给定的出版社回该出版社代码对应的book1表中的的记录:
分析:直接把上面的例子最后面的SQL语句 select * from book1 where 出版社='中国长安' 将里面的 “出版社='中国长安'”用变理代替为 select * from book1 where 出版社= @出版社 其中变量名 @出版社取了代值 '中国长安';由于使用了变量,所以需要定义该变量,我们把“出版社”的长度设为是20位字符串;所以在 AS 之前定义变更@出版社 varchar(20);
create procere p_book1p
@出版社 varchar(20)
AS
SELECT * FROM book1 WHERE 出版社=@出版社
执行含有输入参数的存储过程
1)使用参数名传递参数值
在执行存储过程的语句中通过语句 @paramter_name=value 给出参数的传递值,当存储过程含有多个参数时,参数值可以任意顺序设定,对于允许空值和具有默认值的输入参数可以不给出参数的传递值;其格式语法如下:
exec procere_name
[@paramenter_name=value]
[,....n]
例子:用参数名传递参数值的方法执行存储过程p_book1p,分别查出出版社为'中国长安'和"安徽人民"书的记录
exec p_book1p @出版社='中国长安'
go
exec p_book1p @出版社='安徽人民'
go
2) 按位置传递参数值
在执行存储过程的语句中,不通过参数传递值面直接给出参数的传递值,当存储过程含有多个输入参数时,传递值的顺序必须与存储过程中定义的输入参数顺序相一致,按位置传递参数时,也可以忽略空值和具有默认值的参数,但不能因此破坏输入参数的设定顺序;比如:在一个含有4个参数的存储过程中,用户可以忽略第3和第四个参数,但无法在忽略第3个的情况下而指定第4个参数的输入值;
语法格式如下:
exec procere_name
[value1,value2,....]
例子:用按位置传递参数值的方法执行存储过程 p_book1p 分别查找出版社为“中国人口”和“内蒙人民”书的记录
exec p_book1p '内蒙人民'
go
exec p_book1p '中国人口'
go
按位置传递参数值比按参数名传递参数值更简捷比较适合参数值较少的情况,而按照参数名传递的方法使程序的可读性增强,特别是参数数量较多时,建议用按参数名传递参数的方法,这样的程序可读性/可维护性都要好一些;
3) 带输出参数的存储过程
如果需要从存储过程中返回一个或多个值,可以通过在创建存储过程的语句中定义输出参数来实现,为了使用输出参数,需要在
create procere 语句中指定 output 关键字 输出语法如下: @parameter_name datatype=[defautl] OUTPUT
例如:创建存储过程 p_book1Num 要求能根据用户给定的出版社,统计该出版社的出书数量,并将数量以输入变量的形式返回给用户:
CREATE PROCEDURE p_bookNum
@出版社 var(20),@bookNum smallint output
AS
SET @BOOK1Num= --(这个里面是给book1Num 赋值)
(
select count(*) from book1
where 出版社=@出版社
)
ptrint @book1Num
执行存储过程p_book1Num
由于在存储过程 p_book1Num 中使用了参数@出版社和@book1Num 所以在测试时需要先定义相应的变量,对于输入参数@出版社需要赋值,而输出参数 @book1Num 无需赋值,它是从存储过程中获得返回值供用户进一步使用的
declare @出版社 varchar(20), @book1Num SMALLINT
set @出版社=“中国长安”
exec p_book1Num @出版社,@book1Num
说明:这里在是sql server2005 环境下进行测试的,而在进行系统开发时,往往变量的定义,赋值,使用都是在应用程序中设计的,存储过程 p_book1Num 的 print @book1Num语句也是为了在 SQL Server2005环境中测试而设计的
删除、修改、重命名存储过程
修改存储过程:是由alert 语句来完成的,语法如下:
ALTER procere procere_name
[with encryption]
[with recompile]
as
Sql_statement
例子:使用T-SQL语句修改存储过程 p_book1p 根据用户提供的出版社名称进行模糊查询并要求加密:
alter procere p_book1p
@出版社 varchar(20)
with encryption
as
select 出版社,ISBN号,定价,作者姓名
from book1,teacher
where book1.编号=teacher.编号 and 出版社 like '%@出版社%'
存储过程的删除:存储过程的删除是通过DROP语句来实现的
例如:使用T-SQL语句来删除存储过程p_book1
use book
go
drop procere p_book1
使用SQL-Server Management Studio窗口删除存储过程 p_book1p:
对象资源管理器-> 展开BOOK-> 展开可编程性-> 右键dbo.p_book1p->删除 就可以了
存储过程重命名:
对象资源管理器-> 展开BOOK-> 展开可编程性-> 右键dbo.p_book1p->重命名
存储过程的重编译处理
在存储过程中所用的查询只在编译时进行优化,对数据库进行索引或其他会影响数据库统计的更改后,可能降低已编译的存储过程的效率,通过对存储过程进行重新编译,可以重新优化查询;
在SQL-Server2005 中有三种方法重新编译的方法:
1) 在创建存储过程时使用 with recompile 子句
with recompile 子句可以指示 sql server2005 不将该存储过程的查询计划保存在缓存中,而是在每次运行时重新编译和优化,并创建新 的查询计划;下面是例子:
use book
go
create procere p_book1p
@出版社 varchar(20)
with recompile
as
select * from book1 where 出版社=@出版社
这种方法并不常用,因为在每次执行存储过程时都要重新编译,在整体上降低了存储过程的执行速度,除非存储过程本身是一个比较复杂,耗时的操作,编译的时间相对于执行存储过程时间少;
2) 在执行存储过程时设定重新编译选项
通过在执行存储过程时设定重新编译,可以让SQL-Server2005在执行存储过程时重新编译该存储过程,在这一次执行后,新的查询计划又被保存在缓存中;基语法格式是:
execute procere_name with recompile
以重新编译的方式执行存储过程p_book1p:
use book
go
execute p_book1p '中国长安'with recompile 此方法一般在存储过程创建后,数据发生了显着变化时使用
3) 通过系统存储过程设定重新编译选择;其语法如下
exec sp_recomplie OBJECT 其中OBJECT 当前数据库中的存储过程,表或视图的名称
例子:执行下面的语句将导致book1表的触发器和存储过程在下次运行时将被重新编译:
exec sp_recompile book
===========================================================================================================================
触发器的创建和管理
概述:在SQL-Server2005数据库系统中,存储过程和触发器都是SQL语句和流程控制语句的集合
===========================================================================================================================
❿ 数据库怎么编写存储过程
SQL Server的语法:
create procere proc_name
(@para1 int)
as
sql-statement;
Mysql的语法:
create procere proc_name
(para1 int)
sql-statement;
上面的para1是参数,如果不需要可以省略括号里的内容
sql-statement是你存储过程要执行的语句,
如果还有什么疑问可以说出来