关于存储过程

来源:互联网 发布:什么软件可以录播 编辑:程序博客网 时间:2024/06/08 03:08

关于SQL存储过程的编写

首先,不同数据库的是SQL语法格式不同,相应的存储过程的编写格式也不一样;

所谓存储过程:

存储过程的概念

    存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。

    存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。

由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快。同时由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量、简单网络负担。

 

 1、 存储过程的优点

        A、 存储过程允许标准组件式编程

        存储过程创建后可以在程序中被多次调用执行,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大的提高了程序的可移植性。

        B、 存储过程能够实现较快的执行速度

        如果某一操作包含大量的T-SQL语句代码,分别被多次执行,那么存储过程要比批处理的执行速度快得多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划。而批处理的T-SQL语句每次运行都需要预编译和优化,所以速度就要慢一些。

        C、 存储过程减轻网络流量

        对于同一个针对数据库对象的操作,如果这一操作所涉及到的T-SQL语句被组织成一存储过程,那么当在客户机上调用该存储过程时,网络中传递的只是该调用语句,否则将会是多条SQL语句。从而减轻了网络流量,降低了网络负载。

        D、 存储过程可被作为一种安全机制来充分利用

        系统管理员可以对执行的某一个存储过程进行权限限制,从而能够实现对某些数据访问的限制,避免非授权用户对数据的访问,保证数据的安全。

实际开发中碰到的Sybase ORACLE 的存储过程。实例

Sybase:

create procedure PROC_EPTELWEB_LOGOUT

(

@PHONENUM     VARCHAR(50),   --企业总机号//传入参数

@RET_CODE     tinyint output,  //输出参数

@MSGTEXT      varchar(255) output  //输出参数

)

AS

begin

       --YZF_REGI_INFO表中该总机的信息复制到YZF_REGI_INFO_HIS       

        insert into YZF_REGI_INFO_HIS select * from YZF_REGI_INFO where PHONE_NUM=@PHONENUM

//如果执行出错,事物不会提交,并且设置好输出参数的值后,跳出并返回

        if(@@error != 0)

               begin

                  select  @RET_CODE =1, @MSGTEXT ='YZF_REGI_INFO表中该总机的信息复制到YZF_REGI_INFO_HIS失败'  

                  return

               end

      --YZF_PAY_REC表中该总机的信息复制到YZF_PAY_REC_HIS       

        insert into YZF_PAY_REC_HIS  select * from YZF_PAY_REC where PHONE_NUM=@PHONENUM

        if(@@error != 0)

               begin

                  select  @RET_CODE =1, @MSGTEXT ='YZF_PAY_REC表中该总机的信息复制到YZF_PAY_REC_HIS 失败'  

                  return

               end

       --删除表YZF_WEB_LOG中该总机的信息

       delete from YZF_WEB_LOG where PHONE_NUM=@PHONENUM

       if(@@error != 0)

               begin

                  select  @RET_CODE =1, @MSGTEXT ='删除表YZF_WEB_LOG中该总机的信息失败'  

                  return

               end        

      select @RET_CODE=0,@MSGTEXT='门户销户存储过程调用成功'

      return        

end

ORACLE

CREATE OR REPLACE PROCEDURE PROC_EPTELWEB_LOGOUT(

P_PHONENUM     VARCHAR2,   --企业总机号

RET_CODE   out  INTEGER ,

MSGTEXT    out  varchar2

)

AS

BEGIN     

        begin

            --YZF_REGI_INFO表中该总机的信息复制到YZF_REGI_INFO_HIS

            insert into YZF_REGI_INFO_HIS

            select * from YZF_REGI_INFO t where t.PHONE_NUM=P_PHONENUM;

        exception when others then

            RET_CODE :=1;

            MSGTEXT :='YZF_REGI_INFO表中该总机的信息复制到YZF_REGI_INFO_HIS失败';

            return;

        end;

         begin

            --YZF_PAY_REC表中该总机的信息复制到YZF_PAY_REC_HIS 

            insert into YZF_PAY_REC_HIS

            select * from YZF_PAY_REC t where t.PHONE_NUM=P_PHONENUM;

        exception when others then

            RET_CODE :=1;

            MSGTEXT :='YZF_PAY_REC表中该总机的信息复制到YZF_PAY_REC_HIS失败';

            return

        end;

         begin

            --删除表YZF_WEB_LOG中该总机的信息

            delete  from YZF_WEB_LOG t where t.PHONE_NUM=P_PHONENUM;

        exception when others then

            RET_CODE :=1;

            MSGTEXT :='删除表YZF_WEB_LOG中该总机的信息失败';

            return;

        end;

         begin

            --删除表YZF_REGI_INFO中该总机的信息

            delete  from YZF_REGI_INFO t where t.PHONE_NUM=P_PHONENUM;

        exception when others then

            RET_CODE :=1;

            MSGTEXT :='删除表YZF_REGI_INFO中该总机的信息失败';

            return;

        end;

        

       RET_CODE:=0;

       MSGTEXT:='门户网站用户销户成功';

        

 END;

 

DBArtisan中选中存储过程右击“excecute,进入可视化执行窗口,其中输入一个传入参数值,点击执行即可调用并查看结果信息。

或者,用SQL语句也可以执行,Sybase的实力代码如下:

--run pro

DECLARE @PHONENUM VARCHAR(50)

DECLARE @RET_CODE tinyint

DECLARE @MSGTEXT varchar(255)

EXEC PROC_EPTELWEB_LOGOUT '077053862563',@RET_CODE output,@MSGTEXT output

//格式非常重要,注意仔细核对

select @RET_CODE,@MSGTEXT

 

另外,在一个存储过程中还可以调用另外一个存储过程,根据该存储过程的返回结果进行相应的处理,如果失败,还可以进行回滚,即取消之前的操作;

0 0