db2存储过程调试
JDBC调用存储过程: CallableStatement
在Java里面调用存储过程,写法那是相当的固定:
Class.forName(....
Connection conn = DriverManager.getConnection(....
/**
*p是要调用的存储过程的名字,存储过程的4个参数,用4个?号占位符代替
*其余地方写法固定
*/
CallableStatement cstmt = conn.prepareCall("{call p(?,?,?,?)}");
/**
*告诉JDBC,这些个参数,哪些是输出参数,输出参数的类型用java.sql.Types来指定
*下面的意思是,第3个?和第4个?是输出参数,类型是INTEGER的
*Types后面具体写什么类型,得看你的存储过程参数怎么定义的
*/
cstmt.registerOutParameter(3, Types.INTEGER);
cstmt.registerOutParameter(4, Types.INTEGER);
/**
*在我这里第1个?和第2个?是输入参数,第3个是输出参数,第4个既输入又输出
*下面是设置他们的值,第一个设为3,第二个设为4,第4个设置为5
*没设第3个,因为它是输出参数
*/
cstmt.setInt(1, 3);
cstmt.setInt(2, 4);
cstmt.setInt(4, 5);
//执行
cstmt.execute();
//把第3个参数的值当成int类型拿出来
int three = cstmt.getInt(3);
System.out.println(three);
//把第4个参数的值当成int类型拿出来
int four = cstmt.getInt(4);
System.out.println(four);
//用完别忘给人家关了,后开的先关
cstmt.close();
conn.close();
JDBC调用存储过程,掌握这一个程序足够了.
以下是上面程序使用的存储过程的代码,我用的是Oracle数据库,不过不论是什么数据库,对于你的程序,JDBC这一端写法都是一样的.
create or replace procere p
(v_a in number,v_b number,v_ret out number,v_temp in out number)
is
begin
if(v_a > v_b) then
v_ret := v_a;
else
v_ret := v_b;
end if;
v_temp := v_temp + 1;
end;
② db2存储过程变量问题
创建SQL存储过程(CREATE PROCEDURE (SQL) statement )
CREATE PROCEDURE procere-name(IN | OUT | INOUT parameter-name data-type,...) ) ---存储过程可以设定输入参数和输出参数LANGUAGE SQL ----DB2可以用多种语言编写存储过程,这里用的是纯SQLBEGIN ---开始DECLARE vID smallint; ---定义变量 和Oracle一样 DECLARE 变量名 变量的数据类型;FOR V AS SELECT BRND_CD FROM TMP_BRND_CD ---for循环 tmp_brnd_cd预先创建好DO ---循环体开始SET vID=BRND_CD; ---对vID赋值,db2可以用set赋值,也可以用values赋值,这里可以写成values(BRND_CD) into vIDINSERT INTO WWM_FORINSERT_TEST VALUES(vID); ---往wwm_forinsert_test 插入数据END FOR; --
③ 调用db2存储过程的时候报错报错
declare 出参变量1 ...; 出参变量2...; .....; 出参变量N...;begin 过程(入参1,入参2,...,入参N,出参1,出参2,...,出参N);end;/
④ db2创建存储过程在begin和end中间有东西就报错是什么情况
因为在 Unix 平台下的 DB2 存储过程对于实例用户和受防护用户之间的关系有一个约束,即 DB2 实例用户必须同时是受防护用户的主组中的一个用户。
上述问题的发生就是由于在系统上,实例用户未加入至受防护用户的主组中,从而引发了存取权限不够的问题所导致的,而并非真的发生了如日志中所报的磁盘错误。解决这一问题的方法很简单,只要将实例用户加入该主组即可。
但有时用户会发现,即使已将用户加入到指定组,问题仍然存在,这时还应检查一下实例用户所加入的组是否是实例用户所对应的受防护用户的主组,即检查一下加入的组是否正确。

要找到实例用户所应的受防护用户以及受防护用户的主组,可用如下方法:
转入实例用户 Home 路径下的 sqllib/adm 路径。
执行命令:ls -l .fenced,会得到类似如下输出。
r--r--r-- 1 db2fencj db2fgrp2 0 Jul 30 09:57 .fenced。
输出中表明,该文件所属的用户(db2fencj)即为受防护用户,所属的组(db2fgrp2)即为受防护用户的主组
继而,用户便可验证实例用户是否被加入到了正确的组中,如果结果正确,便可以解决上述问题。
⑤ DB2 V9.7存储过程调试
CREATE PROCEDURE usp_client_insert
(
IN i_tradeSN VARCHAR(20),
IN i_scanSN VARCHAR(20),
OUT o_tradeID INT,
OUT Erro INT,
OUT Erro_msg VARCHAR(20)
)
language sql
specific SPOVERTIMEPAY
dynamic result sets 1
modifies sql data
BEGIN
DECLARE re_1 VARCHAR(20) default 'un';
declare exit handler for not found
begin
set Erro =99;
set vErro_msg = 'insert new trade record failed.';
end;
SET o_tradeID = 0;
if (i_tradeSN is null and i_scanSN is null) then
SET Erro =99;
SET Erro_msg = 'no record for insert.';
THEN SIGNAL SQLSTATE '77880' SET MESSAGE_TEXT = 'no record for insert.';
end if;
if i_tradeSN is null then
SELECT TRADEID INTO o_tradeID FROM TBLTRADES WHERE SCANSN = i_scanSN;
end if;
if i_scanSN is null then
SELECT TRADEID INTO o_tradeID FROM TBLTRADES WHERE TRADESN = i_tradeSN;
end if;
if o_tradeID = 0 then
INSERT INTO TBLTRADES (TRADESN, SCANSN, REMARKS) VALUES ( i_tradeSN,i_scanSN,re_1);
SELECT TRADEID INTO o_tradeID FROM TBLTRADES WHERE TRADESN = i_tradeSN and SCANSN = i_scanSN;
end if;
END
⑥ 怎样在linux的命令行调用db2的存储过程
1.首先连接数据库2.发出一下命令:DB2
-td@
-vf
createSQLproc.DB2
createSQLproc.DB2文件中是创建存储过程的SQL语句;
-td
选项让命令行处理程序使用@作为语句终止字符;
-v
选项让命令处理程序将命令文本回显到标准输出;
-f
让命令行处理程序...
⑦ DB2 DataStudio存储过程入门
建好后 看到如下界面,图中DDL部分是选择的存储过程模板
场景:
输入两个参数A和B,并求和
DDL
只需要按照模板,修改参数部分和主体部分即可
DDL的空白处,鼠标右键——》部署 或者 单击 部署 按钮
存储过程——》运行 或者 单击 运行 按钮 如图
⑧ db2 存储过程 异常处理
存储过程异常的处理:
DECLARE handler-type HANDLER FOR condition handler-action
异常处理器类型(handler-type)有以下几种:
CONTINUE 在处理器操作完成之后,会继续执行产生这个异常语句之后的下一条语句。
EXIT 在处理器操作完成之后,存储过程会终止,并将控制返回给调用者。
UNDO 在处理器操作执行之前,DB2会回滚存储过程中执行的SQL操作。在处理器操作完成之后,存储过程会终止,并将控制返回给调用者。
异常处理器可以处理基于特定SQLSTATE值的定制异常,或者处理预定义异常的类。预定义的3种异常如下所示:
NOT FOUND 标识导致SQLCODE值为+100或者SQLSATE值为02000的异常。这个异常通常在SELECT没有返回行的时候出现。
SQLEXCEPTIOIN 标识导致SQLCODE值为负的异常。
SQLWARNING 标识导致警告异常或者导致+100以外的SQLCODE正值的异常。
如果产生了NOT FOUND 或者SQLWARNING异常,并且没有为这个异常定义异常处理器,那么就会忽略这个异常,并且将控制流转向下一个语句。如果产生了SQLEXCEPTION异常,并且没有为这个异常定义异常处理器,那么存储过程就会失败,并且会将控制流返回调用者。
以下示例声明了两个异常处理器。 EXIT处理器会在出现SQLEXCEPTION 或者SQLWARNING异常的时候被调用。EXIT处理器会在终止SQL程序之前,将名为stmt的变量设为"ABORTED",并且将控制流返回给调用者。UNDO处理器会将控制流返回给调用者之前,回滚存储过程体中已经完成的SQL操作。
清单3:异常处理器示例
DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING SET stmt = 'ABORTED';
DECLARE UNDO HANDLER FOR NOT FOUND;
如果预定义异常集不能满足需求,就可以为特定的SQLSTATE值声明定制异常,然后再为这个定制异常声明处理器。语法如下:
清单4:定制异常处理器
DECLARE unique-name CONDITION FOR SQLSATE 'sqlstate'
处理器可以由单独的存储过程语句定义,也可以使用由BEGIN…END块界定的复合语句定义。注意在执行符合语句的时候,SQLSATE和SQLCODE的值会被改变,如果需要保留异常前的SQLSATE和SQLCODE,就需要在执行复合语句的第一个语句把SQLSATE和SQLCODE赋予本地变量或参数。
通常,会为存储过程定义一个执行状态的输出参数(例如:poGenStatus)。
declare sqlcode integer default 0;
begin
declare continue handler for sqlexception set ret = sqlcode;
declare continue handler for sqlwarning set ret = sqlcode;
declare continue handler for not found set ret = sqlcode;
end ; --异常的声明
--异常的处理
if sqlcode< 0 or sqlcode= 100 then
set O_RetCod = RetCode;
set O_RetMsg = 'CLN02:产品实例关联客户过程出错!';
insert into LOG.OPER_LOG_TAB(PROC_NAME,OBJ_TAB,REGION_COD,OPER_COUNT,ERR_CODE,DATA_TIME,OPER_TIME)
values('P_DW_CLEAN','GLOBAL TEMP',0,0,retcode,CHAR(last_3_mon_time),current TIMESTAMP);
return;
else
set RetCode = 0;
end if;
⑨ 如何执行db2存储过程
1、db2 create database 数据库名 <-- 创建数据库
2、db2 connect to 数据库名 user 用户名 using 用户密码 <-- 连接数据库
3、db2 -tvf otpdb_v3_db2.sql <-- 为新建数据库建立表结构
4、db2 -td@ -f 存储过程文件绝对路径 <-- 导入存储过程,无错误会提示成功
4、调用存储过程:
Windows 下:db2 call 存储过程名(参数1,参数2)
AIX 下:db2 <-- 要先进入DB2,方可调用存储过程或执行SQL语句
db2=>call 存储过程名(参数1,参数2)
5、验证插入数据是否成功
Windows 下:db2 select count(*) from FTOTP_USERINFO
AIX 下:db2 <-- 要先进入DB2,方可调用存储过程或执行SQL语句
db2=>select count(*) from FTOTP_USERINFO
Windows 下:db2 select count(*) from FTOTP_TOKENINFO
AIX 下:db2 <-- 要先进入DB2,方可调用存储过程或执行SQL语句
db2=>select count(*) from FTOTP_TOKENINFO
