存储过程

数据库编程基础
【标识符】
       数据库对象的名称即标识符
       标识符分为标准标识符和分隔标识符,分隔标识符即标识符中包括一些特殊字符,或者定义的标识符为系统中的一些保留字
       若是使用分隔标识符,必须使用括号或者方括号标识起来
 
【数据类型】
一、  精确数字
a)         Bigint
b)        Smallint
c)         Int
d)        Tinyint
e)         Money
f)         Smallmoney
g)        Numeric
h)        Bit
i)          decimal
二、  近似数字
a)         Float
b)        Real
三、  日期和时间
a)         Datetime
b)        smalldatetime
四、  字符串
a)         Char
b)        Text
c)         Varchar
五、  Unicode
a)         Nchar
b)        Ntext
c)         nvarchar
六、  二进制字符串
a)         Binary
b)        Image
c)         varbinary
七、  其余数据类型
a)         Cursor,游标数据
 
【运算符】
一、  算术运算符
a)         +-*/%(取模)
二、  逻辑运算符
a)         ALL
b)        AND
c)         ANY
d)        BETWEEN
e)         EXISTS
f)         IN
g)        LIKE
h)        NOT
i)          OR
j)          SOME
三、  赋值运算符
四、  字符串联接运算符
五、  比较运算符
 
流程控制语句
一、  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
 
二、  BEGIN……END定义语句块
BEGIN
{
SQL语句
}
END
能够写多条SQL语句,在BEGIN……END块中的语句顺序执行
 
三、  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
 
四、  WAITFOR为语句设定执行的延迟
WAITFOR {DELYA ‘TIME’ |  TIME ‘TIME’}
 
例三:
       Begin
       {
              Waitfor time ’23: 30’
              Exec backup_contract
}
 
五、  TRY……CATCH语句
此语句用于对异常的错误处理
BEGIN TRY
    {SQL语句 |  SQL语句块}
END TRY
BEGIN CATCH
{SQL语句 |  SQL语句块}
END CATH
TRY语句块后必须紧跟CATCH块;若是TRY语句块中没有错误,则转到紧邻的下一个END CATCH语句块执行;若是有错误,则会转给下一个CATCH语句中的第一个语句执行
TRY……CATCH语句使用的错误函数
一、  ERROR_NUMBER(),返回错误号
二、  ERROR_MESSAGE(),返回具体错误信息
三、  ERROR_SEVERITY(),返回错误严重性
四、  ERROR_STATE(),返回错误状态号
五、  ERROR-LINE(),返回致使错误的行号
六、  ERROR_PROCEDURE(),返回致使错误的存储过程或者触发器
 
 
【游标】
       在须要按行处理数据的时候,游标能够打开一个结果集,并提供按行处理数据的功能。根据不一样的游标,能够对其进行回滚或者前进
 
1、游标的定义
一、  SQL-92语法
DECLARE NAME [INSENSITIVE] [SCROLL] CURSOR
For select_statement
[for { READ ONLY  |  UPDATE [OF column_name]}]
 
二、  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)     DYNAMICKEYSET型游标:能够动态地显示数据的更新;其中KEYSET型游标不能看到其余用户增长的记录
11)     FAST_FORWARD:用于指定启用了性能优化的FORWARD_ONLYREAD_ONLY型游标
12)     SCROLL_LOCKS:锁会被放置到游标的结果集中
13)     OPTIMITISC:数据被读入游标后,若是对某一行数据进行更新或者删除,操做有可能会失败
14)     TYPE_WARNING:指明游标类型被修改为与用户定义不一样时,向客户端发送一个警告信息
 
例四:添加一个只读型的游标
       DECLARE CompanyCursor CURSOR
       For select * from company
       For READ ONLY
 
2、打开游标
Open cursor-name
 
例五:
       Open CompanyCursor
结果会显示出company表中的全部记录,固然记录是存在于游标中的,用户能够按照本身的须要按行来处理数据
 
3、使用游标读取数据
一、  若是定义为可滚动【SCROLL型游标】的 ,则能够在任什么时候候读取任意行数据
二、  若是定义为非滚动的游标,则只能对当前行的下一行进行读取操做
三、  游标的结果集能够放入到局部变量中
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表示要提取的行不存在
 
4、关闭和释放游标
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类型的参数,则必须指定VARYINGOUTPUT参数
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 ‘北京电信公司
相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息