存储过程

数据库编程基础
【标识符】
       数据库对象的名称即标识符
       标识符分为标准标识符和分隔标识符,分隔标识符即标识符中包括一些特殊字符,或者定义的标识符为系统中的一些保留字
       如果使用分隔标识符,必须使用括号或者方括号标识起来
 
【数据类型】
1、  精确数字
a)         Bigint
b)        Smallint
c)         Int
d)        Tinyint
e)         Money
f)         Smallmoney
g)        Numeric
h)        Bit
i)          decimal
2、  近似数字
a)         Float
b)        Real
3、  日期和时间
a)         Datetime
b)        smalldatetime
4、  字符串
a)         Char
b)        Text
c)         Varchar
5、  Unicode
a)         Nchar
b)        Ntext
c)         nvarchar
6、  二进制字符串
a)         Binary
b)        Image
c)         varbinary
7、  其他数据类型
a)         Cursor ,游标数据
 
【运算符】
1、  算术运算符
a)         + - * / % (取模)
2、  逻辑运算符
a)         ALL
b)        AND
c)         ANY
d)        BETWEEN
e)         EXISTS
f)         IN
g)        LIKE
h)        NOT
i)          OR
j)          SOME
3、  赋值运算符
4、  字符串联接运算符
5、  比较运算符
 
流程控制语句
1、  IF …… ELSE 条件分支语句
If  布尔表达式
    {SQL 语句 |  SQL 语句块 }
ELSE 
    {SQL 语句 |  SQL 语句块 }
布尔表达式是返回 TRUE 或者 FALSE 的表达式;如果表达式包含 SQL 语句,则 SQL 语句必须用括号括起来
 
例一:如果合同号为 101 的合同金额大于 10000 元,则显示“该合同金额为 10000 元”,否则显示“该合同金额不足 10000 元”
       If (select charge from contract)>10000
              Print ‘ 该合同金额为 10000
       ELSE
              Print ‘ 该合同金额不足 10000
 
2、  BEGIN …… END 定义语句块
BEGIN
{
SQL 语句
}
END
可以写多条 SQL 语句,在 BEGIN …… END 块中的语句顺序执行
 
3、  WHILE 语句实现循环
While  布尔表达式
{SQL 语句 |  SQL 语句块 }
{break;}
{SQL 语句 |  SQL 语句块 }
{continue}
{SQL 语句 |  SQL 语句块 }
如果使用嵌套的循环,则 BREAK 会中断本次循环;跳到外层循环去执行
RETURN 可以无条件中止循环
CONTINUE 可以使循环重新开始执行
 
例二:判断一个数是否为素数
       Declare @i int
       Declare @itest int
       Set @itest=59
       Set @i=2
       While @i<@itest
       Begin
              If @itest %@i=0
              Begin
                     Print ‘ 该数不是素数
                     Break
              End
       Set @i=@i+1
       If @itest=@i
       Print ‘ 该数是素数
       End
 
4、  WAITFOR 为语句设定执行的延迟
WAITFOR {DELYA ‘TIME’ |  TIME ‘TIME’}
 
例三:
       Begin
       {
              Waitfor time ’23: 30’
              Exec backup_contract
}
 
5、  TRY …… CATCH 语句
此语句用于对异常的错误处理
BEGIN TRY
    {SQL 语句 |  SQL 语句块 }
END TRY
BEGIN CATCH
{SQL 语句 |  SQL 语句块 }
END CATH
TRY 语句块后必须紧跟 CATCH 块;如果 TRY 语句块中没有错误,则转到紧邻的下一个 END CATCH 语句块执行;如果有错误,则会转给下一个 CATCH 语句中的第一个语句执行
TRY …… CATCH 语句使用的错误函数
1、  ERROR_NUMBER() ,返回错误号
2、  ERROR_MESSAGE() ,返回具体错误信息
3、  ERROR_SEVERITY() ,返回错误严重性
4、  ERROR_STATE (),返回错误状态号
5、  ERROR-LINE (),返回导致错误的行号
6、  ERROR_PROCEDURE() ,返回导致错误的存储过程或者触发器
 
 
【游标】
       在需要按行处理数据的时候,游标可以打开一个结果集,并提供按行处理数据的功能。根据不同的游标,可以对其进行回滚或者前进
 
一、 游标的定义
1、  SQL-92 语法
DECLARE NAME [INSENSITIVE] [SCROLL] CURSOR
For select_statement
[for { READ ONLY  |  UPDATE [OF column_name]}]
 
2、  TRANSACT-SQL 扩展语法
DECLARE NAME CURSOR
[ LOCAL | GLOBAL]
[ FORWARD_ONLY | SCROLL]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD]
[ READ ONLY | SCROLL_LOCKS | OPTIMISTIC]
[ TYPE_WARNING]
FOR select_statement
[for UPDATE [OF column_name] ]
 
1)        NAME :为游标定义名称
2)        INSENSITIVE :创建将由该游标使用的数据的临时复本。对游标的所有操作都从临时数据库中获得数据;所以对些游标进行提取数据时不反映对基表所做的修改;该游标不可以修改
3)        SCROLL :指定所有的提取操作均可以实现;如果不指定则只支持 NEXT 的提取数据操作
4)        select_statement :用于定义 SQL 语句块,该语句块不支持使用 COMPUTE,COMPUTE BY,FOR BROWSE,INTO
5)        READ ONLY :禁止对游标进行修改
6)        UPDATE [OF column_name :用于指定可以更新的数据列
7)        LOCAL :用于指定游标是局部的; GLOBAL 用于指定全局游标
8)        FORWARD_ONLY :用来指定游标只能向前滚,即从第一行读到最后一行
9)        STATIC :用于定义静态游标,允许向任何一个方向移动游标读取数据;但如果在用户查看数据的同时,数据进行了更新,它不会动态地显示出数据的变化
10)     DYNAMIC KEYSET 型游标:可以动态地显示数据的更新;其中 KEYSET 型游标不能看到其他用户增加的记录
11)     FAST_FORWARD :用于指定启用了性能优化的 FORWARD_ONLY READ_ONLY 型游标
12)     SCROLL_LOCKS :锁会被放置到游标的结果集中
13)     OPTIMITISC :数据被读入游标后,如果对某一行数据进行更新或者删除,操作有可能会失败
14)     TYPE_WARNING :指明游标类型被修改成与用户定义不同时,向客户端发送一个警告信息
 
例四:添加一个只读型的游标
       DECLARE CompanyCursor CURSOR
       For select * from company
       For READ ONLY
 
二、 打开游标
Open cursor-name
 
例五:
       Open CompanyCursor
结果会显示出 company 表中的所有记录,当然记录是存在于游标中的,用户可以按照自己的需要按行来处理数据
 
三、 使用游标读取数据
1、  如果定义为可滚动【 SCROLL 型游标】的 ,则可以在任何时候读取任意行数据
2、  如果定义为非滚动的游标,则只能对当前行的下一行进行读取操作
3、  游标的结果集可以放入到局部变量中
FETCH [ NEXT | PRIOR | FIRST | LAST | ABSOLUTE { n | @nvar } | RELATIVE { n | @nvar } ]  FROM { [GLOBAL] cursor-name | cursor-variable-name}
[INTO @variable-name]
 
1)        NEXT :表示紧跟当前行返回结果行,并且以返回行作为当前行;默认的游标提取数据选项
2)        PRIOR :表示返回当前行前一行的数据,并以返回行作为当前行
3)        FIRST :返回第一行数据,并作为当前行
4)        LAST :返回最后一行数据,并作为当前行
5)        ABSOLUTE { n | @nvar } :如果 n 为正数,返回从头开始的第 N 行记录;如果为负数,返回从尾开始的第 N 行数据;如果为零,不返回数据
6)        RELATIVE { n | @nvar } :如果 N 为正数,返回从当前行开始的第 N 条记录;如果为负数,则返回从当前行前的第 N 条数据;如果为零,则返回当前行
7)        GLOBAL :用于指定游标是全局游标
8)        INTO :用此语句将游标的结果集放入一个局部变量中
9)        每一次的 FETCH 操作都会存储在系统变量 @@fetch-status 中。如果执行成功,则变量被设置为 0 ;其值为 -1 表示 FETCH 语句失败或行不存在在结果集中;如果为 -2 表示要提取的行不存在
 
四、 关闭和释放游标
CLOSE cursor-name
DEALLOCATE cursor-name
 
 
【存储过程】
       存储过程分为系统存储过程和用户定义存储过程;其中系统存储过程用 sp_ 开头,扩展存储过程也属于系统存储过程,其用 xp_ 开头
 
定义存储过程
       CREATE PROCEDURE [schema-name.] procedure-name [ ; number]
       [ {@parameter [ type_schema_name.] datatype}
       [ VARYING ] [ =default ] [ [ OUT  [ PUT ] ]
       [ WITH <procedure_option> ]
       [ FOR REPLICATION ]
       AS { sql-statement }
       <procedure_option> ::=
       [ ENCRYPTION ]
       [ RECOMPILE ]
       [ EXECUTE_AS_Clause ]
      
1)        @parameter :是过程中的参数。使用 @ 符号作为第一个字符来指定参数名称
2)        type_schema_name.] datatype :指定参数的数据类型,除了 TABLE 类型外的所有数据类型都可以作为存储过程的参数使用。如果使用 CURSOR 类型的参数,则必须指定 VARYING OUTPUT 参数
3)        VARYING 指定作为输出参数支持的结果集
4)        OUTPUT 指示参数是输出参数。此选项的值可以返回给调用 EXECUTE 的语句
5)        RECOMPILE :指示数据库引擎不缓存该过程的计划,该过程在运行时编译
6)        ENCRYPTION :指示对存储过程文本进行加密。数据库进行复制时不会对此文件进行发布
7)        EXECUTE AS :指定在其中执行存储过程的安全上下文
8)        FRO REPLICATION :指定不能在订阅服务器上执行为复制创建的存储过程
 
例六:创建一个存储过程,返回指定公司的所有合同明细情况
       CREATE PROCEDURE DisplayCompanyDetail
       @CompanyName varchar(50)
       AS
              Select * from contract where CompanyName=@CompanyName
 
       EXEC DisplayCompanyDetail ‘ 北京电信公司

你可能感兴趣的:(存储过程,职场,休闲)