标签归档:存储过程

Oracle 中运行存储过程的两种方法分享(call exec )


摘要:
下文讲述在oracle中运行存储过程所使用的两种方法:call exec
实验环境:sql server 2008 r2



call和exec命令简介及区别

call和exec命令简介:
这两个命令都可用于执行存储过程
call和exec命令区别:
exec是sqlplus中的命令,只可在sqlplus中应用
call 是一个sql命令,可以应用于各个场景
call 执行存储过程时,存储过程名后面一定要跟上括号


call和exec举例应用

---例:运行oracle存储过程  pr_test1 无参数
SQL> exec pr_test1;       
     
SQL> call pr_test1();

---例:运行oracle存储过程  pr_test1 带参数
SQL> exec pr_test1(参数1,参数2);       
     
SQL> call pr_test1(参数1,参数2);

mssql sqlserver中常见优化存储过程的方法分享


摘要:
下文讲述存储过程编写的常见注意事项
实验环境:sql server 2008 R2


1.存储过程编写名称前缀注意事项

使用非sp开头的存储过程名称,避免出现同系统存储过程命名相同,导致存储过程无法执行的异常情况发生。

2.存储过程动态执行sql脚本,尽量使用sp_executesql

在存储过程中使用 sp_executesql执行sql脚本,可以使sqlserver缓存执行计划,加快sql编译速度,所以在存储过程中,我们应该尽量采用
sp_executesql替换exec动态执行脚本。


3.存储过程开头使用nocount on关键字

在存储过程开头使用 set noconut on关键字,可避免存储过程返回额外的信息,减少IO输出。


4.存储过程中表访问最好加上表Schema

在存储过程中访问表时,加上表Schema可以加快表检索,减少sql引擎访问缓存的次数,
也可避免用户无法检索到Schema时,产生的错误信息。

5.存储过程中避免使用长事务

在存储过程编写中,事务会锁定相应的表,我们尽量使每次事务短,减少锁表时间,加大存储过程对大并发的支持力度。


6.慎用游标

游标每次都会查询表,增大了对IO的访问次数,加大服务器负担,所以必须少使用游标

7.使用try catch捕捉sql错误信息

begin try 
    begin tran 
        /*sql脚本*/
    commit 
end try 
begin catch 
     /*输出错误信息*/
    rollback 
end catch

mssql sqlserver 获取存储过程参数信息的方法分享


摘要:
下文讲述使用sqlserver系统对象获取存储过程参数的方法分享,如下所示:
实验环境:sqlserver 2008 R2


由于需要编写一个存储过程通用的参数化生成器,需要获取存储过程中的参数信息,下文将利用系统对象获取存储过程中的参数信息,如下所示:

实现思路:
通过查询系统对象” INFORMATION_SCHEMA.PARAMETERS”,输入响应的架构名称和存储过程名称获取相应的参数信息。

    SELECT PARAMETER_NAME as [参数名称],
     DATA_TYPE as [参数类型],
     ISNULL(CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION) as [长度],
     NUMERIC_SCALE  as [精度],
     PARAMETER_MODE as [参数类型(输入/输出)] 
    FROM INFORMATION_SCHEMA.PARAMETERS
    WHERE SPECIFIC_SCHEMA = '架构名称' AND  SPECIFIC_NAME = '存储过程名称'

-----例:获取pr_maomao存储过程的参数信息
       SELECT PARAMETER_NAME as [参数名称],
              DATA_TYPE as [参数类型],
              ISNULL(CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION) as [长度],
              NUMERIC_SCALE  as [精度],
              PARAMETER_MODE as [参数类型(输入/输出)] 
    FROM INFORMATION_SCHEMA.PARAMETERS
   WHERE SPECIFIC_SCHEMA = 'dbo' AND  SPECIFIC_NAME = 'pr_maomao'