db2存储过程

一. 使用存储过程的好处

  1. 减少客户机与服务器之间的网络使用率,以及数据库锁定保持的时间

      应用程序通常在执行每个SQL语句都要跨网络两次,存储过程可以将SQL语句集中在一起,

    从而使得对于每一组SQL语句只需要跨网络两次。存储过程中集中在一起的SQL语句越多,

    网络的使用率和数据库锁定保持的时间就越低。通过减少网络使用率和数据库锁定的时间长短,

    就可以提高网络的总体性能并减少锁定争用问题。

二. 用于存储过程的语言

  在DB2的"开发中心",可以用Java或SQL来创建存储过程。

三. SQL存储过程

  1. 使用SQL过程语言来编写存储过程具有下列优点:

    a. 可以通过在"开发中心"中使用集成调试器来调试SQL存储过程

    b. 借助SQL存储过程,可以调用其它SQL过程,最多可以嵌套16层调用

    c. SQL存储过程运行速度快,因为它是作为已编译的例程来运行的

  2. SQL存储过程具有大小和参数限制,这取决于正在运行的DB2版本:

    a. 对于DB2 Windows版和UNIX版,在版本7和版本8中,SQL存储过程的最大大小是64KB

四. Java存储过程

   1. 使用Java语言来编写存储过程具有下列优点:

    a. 在Java的安全性限制之内,可以使用Java存储过程进行文件的输入/输出。SQL存储过程不支持

      文件的输入/输出。

五. 存储过程的基本语法 

create procedure db2Inst.proce1(
    in "inParam" integer,
    out "outParam" varchar(10)
)
specific "proce1"
language sql
dynamic result sets 1
not deterministic
external action
modifies sql data
old savepoint level

begin
    L1: begin
        /*变量定义*/
        declare inum integer default 0;

        /*变量赋值*/
        set inum = 20;

        /*分支语句*/
        if 条件1 then
            ...
        elseif 条件2 then
            ...
        else
            ...
        end if;

        /*多分支语句case*/
        case 变量名
            when 变量值1 then
                ...
            when 变量值2 then
                ...
            else
                ...
        end case;

        /*for循环*/
        for 变量名 as 游标名或select 表达式
        do
            ...
        end for;

        /*while循环*/
        while 条件表达式 do
            ...
        end while;

        /*loop语句*/
        insLoop:
        loop
            ...
            leave insLoop;/*中断循环*/
            iterate insLoop;/*下一个循环*/
        end loop;

        /*游标的使用方式一*/
            /*定义游标*/
            declare 游标名 cursor for select 语句;
            /*打开游标*/
            open 游标名;
            /*取值*/
            fetch 游标名 into 变量列表;
            /*关闭游标*/
            close 游标名;

        /*goto语句*/
        goto fail;
            ...
        success: return 0
        fail: return -200

    end L1;

    /*游标的使用方式二*/
    /*游标的定义如果放在中间段,要用"begin...end;"段分割标志分割开*/
    L2: begin
        declare v_notfound integer default 0;
        declare stmt statement;/*声明放游标的值 */
        declare cur cursor with return for stmt;/*声明动态游标存储变量*/
        declare continue handler for not found set v_notfound = 1;

        prepare stmt from qrySql;
        open cur;
        fetch cur into 变量列表;
        close cur;
    end L2;

end

六. 存储过程属性说明

procedureName:存储过程的名字,在同一个数据库的同一模式下,不能存在
    存储过程名相同,参数数目相同的存储过程,即使参数的类型不同也不行

(in|out|inout paramName dataType, ...):传入参数
    in:输入参数,out:输出参数,inout:作为输入输出参数
    dataType:参数类型,可以接收SQL类型和创建的表,不支持long varchar,
        long vargraphic,datalink,reference和用户自定义类型。

specific specificName:唯一的特定名称(别名),可以用存储过程名代替。
    用于给存储过程添加注释用,但不能调用存储过程。如果不指定,则数据库
    会自动生成一个yymmddhhmmsshhn时间戳的名字。

language sql:指定过程的主体用的是SQL语言

dynamic result sets integer:指定存储过程返回结果的最大数量,若小于实际返回数量,则db2返回警告

deterministic or not deterministic:表示存储过程是动态或者非动态的。
    动态的返回的值是不确定的,非动态每次返回值都是相同的

external action or no external action:表示存储过程是否执行改变数据库状态的活动,
    而不通过数据库管理器。默认是external action。如果指定为no external action,
    则数据库会确定最佳优化方案。

contains sql, reads sql data, modifies sql data:指定存储过程中的SQL访问级别
    contains sql:表示存储过程可以执行中,既不可读取SQL数据,也不可修改SQL数据。
    reads sql data:表示存储过程可以执行中,可读取SQL,但不可修改SQL数据。
    modifies sql data:表示存储过程可以执行任何SQL语句。可以对数据库中的数据进行
        增加、删除和修改。

old savepoint level or new savepoint level:建立存储点(存储某个时候的数据),
    old savepoint level是默认的存储点

called on null input:表示可以调用存储过程而不管任何的输入参数是否为NULL,并且,
    任何的out或者inout参数可以返回一个NULL或者非空值。检验参数是否为NULL是在过程中进行的。

inherit special registers:表示继承专用寄存器

parameter ccsid:指定所有输出字符串数据的编码,默认为unicode编码数据库为:parameter ccsid unicode,
    其他的数据库默认为:parameter ccsid 3 ascii

七. 存储过程调用另一存储过程,返回结果集

  1. 存储过程1:返回2个结果集

create procedure db2Inst.proc1()
language sql
result sets 2

P1:begin
    declare c1 cursor with return to caller for select语句;
    declare c2 cursor with return to caller for select语句;

    open c1;
    open c2;

    ...
end P1

  2. 存储过程2:调用存储过程1,取得2个结果集

create procedure db2Inst.proc2()
language sql

P1:begin
    /*建立一个结果集数组*/
    declare loc1,loc2 result_set_locator varying;
    /*调用存储过程1,返回结果集*/
    call proc1;
    /*将返回结果集和结果集数组关联*/
    associate result set locator(loc1,loc2) with procedure proc1;
    /*将结果集数组进行分配*/
    allocate cursor1 cursor for result set loc1;
    allocate cursor2 cursor for result set loc2;

    /*直接从结果集中取值*/
    fetch cursor1 into 变量列表;
    close cursor1;

    ...
end P1

时间: 2024-10-27 14:03:45

db2存储过程的相关文章

DB2 存储过程语法(翻译)

语法说明 1.procedure-name: 存储过程的名字,在同一个数据库的同一模式下,不能存在存储过程名相同参数数目相同的存储过程,即使参数的类型不同也不行. 2.(IN | OUT | INOUT parameter-name data-type,...) :传入参数     IN:输入参数 OUT:输出参数 INOUT:作为输入输出参数     parameter-name:参数名字,在此存储过程中唯一的标识符. data-type:参数类型,可以接收SQL类型和创建的表.不支持LONG

db2存储过程迁移

一.导出存储过程 EXPORT TO D:/PROCUDURE/procudure.del OF del MODIFIED BY LOBSINFILE SELECT 'SET CURRENT SCHEMA '||rtrim(procschema)||'@'||chr(10)||'SET CURRENT PATH = SYSIBM,SYSFUN,SYSPROC,'||rtrim(procschema)||' @'||chr(10)||text||chr(10)||'@'||chr(10)FROM

db2 存储过程迁移方法

大家在迁移数据库时,存储过程一般也要迁移过去,但一般有两个问题: 1. 很多存储过程有先后关系(存储过程调用存储过程),如果存储过程数量少,还能手动操作,如果量大,那真是要疯了. 2. 存储过程过大(行数过多),导致异常 这边有个方法,或许可以解决这个问题. 一. 导出存储过程 EXPORT TO G:/PROCUDURE/procudure.del OF del MODIFIED BY LOBSINFILE SELECT 'SET CURRENT SCHEMA '||rtrim(procsch

db2存储过程报SQL0104N错误

ERROR [42601] [IBM][DB2/LINUXX8664] SQL0104N  An unexpected token "insert" was found following "".  Expected tokens may include:  "<psm_semicolon>". 这种情况是存储过程语法报错,解决方法是注释一段代码,执行存储过程,去测试是哪一段代码语法有问题

DB2存储过程语法规则

如何声明一个存储过程CREATE PROCEDURE 存储过程名(IN 输入变量名 输入变量类型,OUT 输出变量名 输出变量类型)紧跟其后的是存储过程属性列表            常用的有:LANGUAGE SQL.MODIFIES SQL DATA.RESULT SETS 1(返回结果集个数)l         存储过程体以begin开始l         存储过程体以end结束存储过程约束规则存储过程中调用存储过程CALL 存储过程名(参数1,参数2,参数n)例:call spco_in

db2存储过程动态sql被截断

编写存储过程,使用动态sql时,调试时发现变量赋值后被截断. 关键代码如下: 实现的效果是先把上下游做对比的sql语句和相关参数存入RKDM_DATA_VOID_RULE, 执行存储过程后把两个sql语句得出的结果插入另一张结果表RKDM_DATA_VOID_CHK_REST. 建表语句: CREATE TABLE RKDM_DATA_VOID_CHK_REST ( DATA_DT DATE, ORDR_NUM INTEGER, CHK_BIG_CLS VARCHAR(256), DATA_PR

DB2存储过程实现查询表数据,生成动态SQL,并执行

一.动态执行SQL PREPARE S1 FROM 'delete from test'; EXECUTE S1; 二.使用游标 DECLARE V_CURSOR CURSOR FOR SELECT DELETESQL,INSERTSQL FROM FJDC.V_I_DG_DM_ZY_WL_ZBHZ_ATTR T; OPEN V_CURSOR; FETCH V_CURSOR INTO V_DELETESQL,V_INSERTSQL; CLOSE V_CURSOR; 三.WHILE循环 WHILE

DB2 存储过程中执行动态SQL

样本代码: DROP PROCEDURE QUOTATION.COPY_SAMPLE; CREATE PROCEDURE QUOTATION.COPY_SAMPLE ( IN tableNameFrom VARCHAR(30) , IN tableNameTo VARCHAR(30) , INOUT copyResult INTEGER) BEGIN DECLARE SQLCODE INTEGER DEFAULT 0; SET copyResult = 0; -- Proecss 1 BEGIN

DB2 存储过程简单示例

while循环 for循环 使用truncate语句 循环体中出现commit或者rollback语句,游标会退出,因此要加上 with hold 关键字 游标的另一种写法 异常处理 动态SQL 以上代码都测试执行通过. 原文地址:https://www.cnblogs.com/rabbit624/p/11557297.html