技术开发 频道

DB2编程基础要点

    1.11 取得处理的记录数

declare v_count int; update tb_test set t1=0 where t2=2’;

     --检查修改的行数,判断指定的记录是否存在

    get diagnostics v_ count=ROW_COUNT;

    只对update,insert,delete起作用.

    不对select into 有效

    1.12 从存储过程返回结果集(游标)的用法

    1、建一sp返回结果集

    CREATE PROCEDURE DB2INST1.Proc1 ( )

    LANGUAGE SQL

    result sets 2(返回两个结果集)

    ------------------------------------------------------------------------

    -- SQL 存储过程

    ------------------------------------------------------------------------

    P1: BEGIN

declare c1 cursor with return to caller for select market_code from tb_market_code;

    --指定该结果集用于返回给调用者

declare c2 cursor with return to caller for select market_code from tb_market_code; open c1; open c2; END P1

    2、建一SP调该sp且使用它的结果集

CREATE PROCEDURE DB2INST1.Proc2 ( out out_market_code char(1)) LANGUAGE SQL ----------------------------------- -- SQL 存储过程 ----------------------------------- P1: BEGIN declare loc1,loc2 result_set_locator varying; --建立一个结果集数组 call proc1; --调用该SP返回结果集。 associate result set locator(loc1,loc2) with procedure proc1; --将返回结果集和结果集数组关联 allocate cursor1 cursor for result set loc1; allocate cursor2 cursor for result set loc2; --将结果集数组分配给cursor fetch cursor1 into out_market_code; --直接从结果集中赋值 close cursor1; END P1

    3、动态SQL写法

DECLARE CURSOR C1 FOR STMT1; PREPARE STMT1 FROM 'ALLOCATE C2 CURSOR FOR RESULT SET ?';

    4、注意:

    一、 如果一个sp调用好几次,只能取到最近一次调用的结果集。

    二、 allocate的cursor不能再次open,但可以close,是close sp中的对应cursor。

    1.13 类型转换函数 

select cast ( current time as char(8)) from tb_market_code

    1.14 存储过程的互相调用

    目前,c sp可以互相调用。

    Sql sp 可以互相调用,

    Sql sp 可以调用C sp,

    但C sp 不可以调用Sql sp(最新的说法是可以)

    1.15 C存储过程参数注意

create procedure pr_clear_task_ctrl( IN IN_BRANCH_CODE char(4), IN IN_TRADEDATE char(8), IN IN_TASK_ID char(2), IN IN_SUB_TASK_ID char(4), OUT OUT_SUCCESS_FLAG INTEGER ) DYNAMIC RESULT SETS 0 LANGUAGE C PARAMETER STYLE GENERAL WITH NULLS(如果不是这样, sql 的sp将不能调用该用c写的存储过程,产生保护性错误) NO DBINFO FENCED MODIFIES SQL DATA EXTERNAL NAME 'pr_clear_task_ctrl!pr_clear_task_ctrl'@

    1.16 存储过程fence及unfence

    fence的存储过程单独启用一个新的地址空间,而unfence的存储过程和调用它的进程使用同一个地址空间。一般而言,fence的存储过程比较安全。有时一些特殊的要求,如要取调用者的pid,则fence的存储过程会取不到,而只有unfence的能取到。

    1.17 SP错误处理用法

    如果在SP中调用其它的有返回值的,包括结果集、临时表和输出参数类型的SP,DB2会自动发出一个SQLWarning。而在我们原来的处理中对于SQLWarning都会插入到日志,这样子最后会出现多条SQLCODE=0的警告信息。

    处理办法:

    定义一个标志变量,比如DECLARE V_STATUS INTEGER DEFAULT 0,

    在CALL SPNAME之后, SET V_STATUS = 1,

create procedure pr_clear_task_ctrl( IN IN_BRANCH_CODE char(4), IN IN_TRADEDATE char(8), IN IN_TASK_ID char(2), IN IN_SUB_TASK_ID char(4), OUT OUT_SUCCESS_FLAG INTEGER ) DYNAMIC RESULT SETS 0 LANGUAGE C PARAMETER STYLE GENERAL WITH NULLS (如果不是这样,sql 的sp将不能调用该用c写的存储过程,产生保护性错误) NO DBINFO FENCED MODIFIES SQL DATA EXTERNAL NAME 'pr_clear_task_ctrl!pr_clear_task_ctrl'@

    1.18 import用法

    db2 import from gh1.out of DEL messages err.txt insert into db2inst1.tb_dbf_match_ha

    注意要加schma

    1.19 values的使用

    如果有多个 set 语句给变量付值,最好使用values语句,改写为一句。这样可以提高效率。

    但要注意,values不能将null值付给一个变量。

    values(null) into out_return_code;

    这个语句会报错的。

    1.20 给select 语句指定隔离级别

    select * from tb_head_stock_balance with ur

    1.21 atomic及not atomic区别

    atomic是将该部分程序块指定为一个整体,其中任何一个语句失败,则整个程序块都相当于没做,包括包含在atomic块内的已经执行成功的语句也相当于没做,有点类似于transaction。

0
相关文章