当前位置:
文档之家› SQLSERVER和DB2存储过程规范实例
SQLSERVER和DB2存储过程规范实例
• 带输出存储过程示例
CREATE PROCEDURE titles_sum @@TITLE varchar(40) = \'%\', @@SUM money OUTPUT AS SELECT \'Title Name\' = title FROM titles WHERE title LIKE @@TITLE SELECT @@SUM = SUM(price) FROM titles WHERE title LIKE @@TITLE GO 说明 OUTPUT 变量必须在创建表和使用该变量时都进行定义。 参数名和变量名不一定要匹配,不过数据类型和参数位置必须匹配(除非使用 @@SUM = variable 形式)。
• 什么是SQL语言?
SQL语言是应用程序和SQL Server数据库之间的主要 编程接口。使用SQL语言编写代码时,可用两种方法 存储和执行代码。
① 第一种是在客户端存储代码,并创建向数据库管理系统发送S QL命令(或SQL语句)并处理返回结果给应用程序; ② 第二种是将这些发送的SQL语句存储在数据库管理系统中,这 些存储在数据库管理系统中的SQL语句就是存储过程。
• 使用 WITH ENCRYPTION 选项
WITH ENCRYPTION 子句对用户隐藏存储过程的文本。下例创建加密过程, 使用 sp_helptext 系统存储过程获取关于加密过程的信息,然后尝试直接从 sysco mments 表中获取关于该过程的信息。 GO USE pubs GO CREATE PROCEDURE encrypt_this WITH ENCRYPTION AS SELECT * FROM authors GO EXEC sp_helptext encrypt_this
• 带参存储过程示例
如果我们需要从存储过程中返回一个或多个值,可以通过在创建 存储过程的语句中定义输出参数来实现,为了使用输出参数,需 要在CREATE PROCEDURE语句中指定OUTPUT关键字。 用户可以通过RETUEN语句返回状态值,RETURN语句只能返回 整数,在存储过程中RETURN不能返回空值,默认返回值是0。也 可以利用它返回整数输出参数值。
• 执行存储过程
[ EXEC [ UTE ] ] { [ @return_status = ] { procedure_name [ ;number ] | @procedure_name_var } [ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAUL T]] [ ,...n ] [ WITH RECOMPILE ]
• 使用 WITH ENCRYPTION 选项
下面是结果集: The object\'s comments have been encrypted. 接下来,选择加密存储过程内容的标识号和文本。 SELECT c.id, c.text FROM syscomments c INNER JOIN sysobjects o ON c.id = o.id WHERE = \'encrypt_this\’ 下面是结果集: 说明 text 列的输出显示在单独一行中。执行时,该信息将与 id 列信息出现 在同一行中。 id text ---------- -----------------------------------------------------------1413580074 ?????????????????????????????????e?????????
• 带通配符存储过程示例
USE pubs IF EXISTS (SELECT name FROM sysobjects WHERE name = \'au_info2\' AND type = \'P\') DROP PROCEDURE au_info2 GO USE pubs GO CREATE PROCEDURE au_info2 @firstname varchar(30) = \'D%\‘ AS SELECT au_lname FROM authors WHERE au_fname LIKE @firstname GO
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 FROM authors GO
执行字符串:
EXEC [ UTE ] ( { @string_variable | [ N ] 'tsql_string' } [ + ...n ] )
• 存储过程示例
• 由用户使用CREATE PROCEDURE语句在当前数据库中创建 • 数据库所有者拥有使用CREATE PROCEDURE语句的默认权限 示例
• 带参存储过程示例
IF EXISTS (SELECT name FROM sysobjects WHERE name = \'au_info\' AND type = \'P\‘) DROP PROCEDURE au_info GO USE pubs GO CREATE PROCEDURE au_info @name varchar(40) AS SELECT au_lname FROM autable WHERE a_name = @name GO
• 带输出游标存储过程示例
USE pubs IF EXISTS (SELECT name FROM sysobjects WHERE name = \'titles_cursor\' and type = \'P\') DROP PROCEDURE titles_cursor GO CREATE PROCEDURE titles_cursor @titles_cursor CURSOR VARYING O UTPUT AS SET @titles_cursor = CURSOR FORWARD_ONLY STATIC FOR SELECT * FROM titles OPEN @titles_cursor GO
2.删除存储过程
存储过程的删除是通过DROP语句来实现的,在企业管理器也同 样可以进行删除。 Drop Procdure sp_name [,…n]
• 修改和删除存储过程
扩展存储过程提供从SQL Server到外部程序的接口。扩展存储过 程和普通存储过程一样,可以接收用户的输入参数,也可以返回 执行结果和执行状态。扩展存储过程能够以类似存储过程的方式, 动态装入和执行动态链接库
• 注意事项
对于存储过程要注意的几点 1,用户定义的存储过程只能在当前数据库中创建(临时存储过程 除外,临时存储过程在tempdb库中创建) 2,成功执行CREATE PROCEDURE语句后,存储过程名称存储 在sysobjects系统表中,而语句的文本存储在syscomments中 3,自动执行存储过程。sqlserver启动时自动执行一个或多个存储 过程,这些过程必须由系统管理员在master库中创建, 并在sysadmin固定服务器角色下作为后台过程执行。
• 带参数存储过程
执行使用参数名传递参数值的存储过程的语法格式如下:
EXECUTE 存储过程名[@参数名=参数值] [,...n] 2、按参数位置传递参数值,不显示地给出“@参数名”,而是按 照参数定义的顺序给出参数值。按位置传递参数时,也可以忽 略允许空值和具有默认值的参数,但不能因此破坏输入参数的 指定顺序,必要时,使用“Default”作为默认值的占位。
1.2存储过程类型
• 存储过程类型
1,系统存储过程: 是由sqlserver提供的存储过程,可以作为命 令执行,一般定义在master库中,前缀是“sp_” 2,扩展存储过程:是在sqlserver环境之外,使用编程语言创建的 外部例程行程的动态链接库使用是,先将DDL加载到数据库中, 并按照使用存储过程的方法执行。(可能引发安全问题) 3,用户存储过程:用户使用T-SQL语言编写的,也可以通过CLR 编写方式
• 使用 WITH RECOMPILE 选项
如果为过程提供的参数不是典型的参数,并且新的执行计划不应高速缓存或存 储在内存中,WITH RECOMPILE 子句会很有帮助。 CREATE PROCEDURE titles_by_author @@LNAME_PATTERN varchar(30) = \'%\' WITH RECOMPILE AS SELECT RTRIM(au_fname) + \' \' + RTRIM(au_lname) AS \'Authors full nam e\', title AS Title FROM authors WHERE au_lname LIKE @@LNAME_PATTERN GO
• 存储过程重编译
1.在创建存储过程时设定 [With Recompile] 2.在执行存储过程时设定 Exec SP_NameWith Recompile 3.通过系统存储过程设定 Exec SP_Recompile 数据库对象
• 修改和删除存储过程1来自修改存储过程存储过程的修改是由ALTER语句来完成的,基本语法如下。 ALTER PROCEDURE 存储过程名 [WITH ENCRYPTION] [WITH RECOMPILE] AS SQL语句
1.3存储过程创建
• 创建和执行
创建存储过程的基本语法如下:
CREATE PROC [ EDURE ] procedure_name [ ; number ] [ { @parameter data_type } [ VARYING ] [ = default ] [ OUTPUT ] ] [ ,...n ] [ WITH { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTIO N}] [ FOR REPLICATION ] AS sql_statement [ ...n ]