DB2编程序技巧 (四)
程序员文章站
2022-06-24 18:35:01
正在看的db2教程是:db2编程序技巧 (四)。1.10 预防字段空值的处理 select deptno ,deptname ,coalesc...
正在看的db2教程是:db2编程序技巧 (四)。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),
  正在看的db2教程是:db2编程序技巧 (四)。; 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'@
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),
  正在看的db2教程是:db2编程序技巧 (四)。; 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'@