阅读内容 

DB2编程序技巧 (四)

[日期:2004-06-17] 来源:不详  作者:佚名 [字体: ]
1.10 预防字段空值的处理
SELECT?DEPTNO?,DEPTNAME?,COALESCE(MGRNO?,'ABSENT'),ADMRDEPT
FROM?DEPARTMENT
???COALESCE函数返回()中表达式列表中第一个不为空的表达式,可以带多个表达式。
???和oracle的isnull类似,但isnull好象只能两个表达式。
?????

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'@


阅读:
录入:

推荐 】 【 打印
相关新闻      
本文评论       全部评论
发表评论
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款


点评: 字数
姓名:
Advertisement
内容查询


Advertisement