JAVA调用ORACLE存储过程问题

这个是我的JAVA程序
public void insertTel_res_rowfame(MDFRowframeresDTO md, String userName)
throws SQLException {
if (md.getStartNo().length() != 0) {
int startNo = Integer.parseInt(md.getStartNo());
int endNo = Integer.parseInt(md.getEndNo());
int RES_ID = ge
.getMaxDev("select max(RES_ID) from TEL_RES_ROWFRAME_RES");// 横列资源ID
db
.setCStatement("begin UPLOAD_MDF_ROWFRAME(?,?,?,?,?,?,?,?); end;");
db.cstmt.setInt(1, bureau_id);
db.cstmt.setInt(2, mdf_id);
db.cstmt.setString(3, md.getMdfcode());
db.cstmt.setString(4, md.getHlbcode());
db.cstmt.setString(5, userName);
db.cstmt.setInt(6, startNo);
db.cstmt.setInt(7, endNo);
db.cstmt.setInt(8, RES_ID);
db.cstmt.executeUpdate();
db.commit();
db.cstmt.close();
System.out.println("正在插入表(TEL_RES_ROWFRAME_RES)述据");
System.out.println("bureau_id=" + bureau_id + "mdf_id=" + mdf_id
+ "mdf_code=" + md.getMdfcode() + md.getHlbcode()
+ "start_no=" + startNo + "end_no=" + endNo+"res_id="+RES_ID);
}
}

这个是数据库连接类 连接没有问题;
// 调用存储过程
public void setCStatement(String cstatment) throws SQLException {
cstmt = con.prepareCall(cstatment);
}

这个是存储过程,用PLSQL测试都能成功,但是用JAVA调用也没有错误,就是数据没有INSERT进去;
CREATE OR REPLACE PROCEDURE UPLOAD_MDF_ROWFRAME(
BUREAU_ID IN TEL_SYS_BUREAU.BUREAU_ID%TYPE, --接入间编码
MDF_ID IN TEL_RES_LAYOUTFRAME_DEV.DEV_ID%TYPE, --设备ID
MDF_CODE IN TEL_RES_ROWFRAME_RES.ROW_NO%type, --MDF编码
MDF_HLBCODE IN TEL_RES_ROWFRAME_RES.ROW_BLOCK_NO%type, -- MDF横列板编码
USERNAME IN TEL_RES_ROWFRAME_RES.USERNAME%TYPE, --导入用户名
IN_RES_ID TEL_RES_ROWFRAME_RES.RES_ID%TYPE, --资源ID
START_NO IN int, --开始设备号
END_NO IN Int )is --终止设备号
RES_ID TEL_RES_ROWFRAME_RES.RES_ID%TYPE;
temVar NUMBER;
x NUMBER;
CODE VARCHAR2(10);
BEGIN
RES_ID :=IN_RES_ID;
temVar :=0;
CODE:='0';
x:=START_NO-1;
loop
RES_ID:=RES_ID+1;
x:=x+1;
exit when x>END_NO;
CODE :=x;
IF LENGTH(CODE)<3 THEN
CODE:='0'||CODE;
END IF;
IF LENGTH(CODE)<3 THEN
CODE :='0'||CODE;
END IF;
select count(*) into temVar from TEL_RES_ROWFRAME_RES where BUREAU_ID=bureau_id and DEV_ID=mdf_id and RES_CODE=
MDF_CODE||'-'||MDF_HLBCODE||'_'||CODE;
IF temVar=0 THEN
INSERT INTO TEL_RES_ROWFRAME_RES ( BUREAU_ID,DEV_ID,RES_ID,RES_CODE,ROW_NO,ROW_BLOCK_NO,ROW_PORT_NO,STATE_ID,NOTE,VER_NUMBER,INSERT_TIME,INSERT_FLAG,USERNAME )
VALUES(bureau_id,MDF_ID,RES_ID+1,MDF_CODE||'-'||MDF_HLBCODE||'_'||CODE,MDF_CODE,MDF_HLBCODE,x,1,NULL,0,SYSDATE,0,USERNAME);
COMMIT;
END IF;
END LOOP;
END UPLOAD_MDF_ROWFRAME;
在控制台打印出
正在插入表(TEL_RES_ROWFRAME_RES)述据
bureau_id=10200mdf_id=97mdf_code=0101H01start_no=0end_no=31res_id=15
正在插入表(TEL_RES_ROWFRAME_RES)述据
bureau_id=10200mdf_id=97mdf_code=0101H01start_no=32end_no=63res_id=15
正在插入表(TEL_RES_ROWFRAME_RES)述据
bureau_id=10200mdf_id=97mdf_code=0101H01start_no=64end_no=95res_id=15
正在插入表(TEL_RES_ROWFRAME_RES)述据
bureau_id=10200mdf_id=97mdf_code=0101H01start_no=96end_no=127res_id=15

dao

7个回答

mdf_code || '-' || mdf_hlbcode || '_' || code 这个不对,你查询和插入的值不一样;还有就是顺序不对;

我估计是数据库事务回滚了,我不知道你工程里面处理事务是用什么控制的,不过问题应该是出在事务控制上,因为你存储过程是已经执行了,然且是没有出错的,而且plsql上也是没有的,所以问题肯定可以确定为是你的java端的事务回滚造成的,你可以看下是不是有这样的一个情况,就是你程序执行当中,你查看下数据库的记录条数,应该是会增加了几条,然后又恢复到原来的条数了!

你的参数顺序不对

bureau_id
mdf_id

mdf_code

mdf_hlbcode
username

in_res_id

start_no

end_no

对比一下 :
db.cstmt.setInt(1, bureau_id);
db.cstmt.setInt(2, mdf_id);
db.cstmt.setString(3, md.getMdfcode());
db.cstmt.setString(4, md.getHlbcode());
db.cstmt.setString(5, userName);
db.cstmt.setInt(6, startNo);
db.cstmt.setInt(7, endNo);
db.cstmt.setInt(8, RES_ID);

你的顺序错了,造成:
SELECT COUNT(*)
INTO temvar
FROM tel_res_rowframe_res
WHERE bureau_id = bureau_id
AND dev_id = mdf_id
AND res_code = mdf_code || '-' || mdf_hlbcode || '_' || code

查出来有可能会有结果,所以没有执行插入操作
以上情况,只是猜测,没有实际环境测试

JAVA调用是不是没有提交这个sql

改成这样应该没问题了
db.cstmt.setInt(7, startNo);
db.cstmt.setInt(8, endNo);
db.cstmt.setInt(6, RES_ID);

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问