博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oracle存储过程获取异常信息码和异常信息
阅读量:6951 次
发布时间:2019-06-27

本文共 3424 字,大约阅读时间需要 11 分钟。

hot3.png

oracle存储过程,可以通过sqlcode 获取异常编码、通过sqlerrm获取异常信息。

例子:

create or replace procedure write2blob(p_id        in number, --id                                       p_blob_data in blob,                                       p_msg       out varchar2) --数据 is  v_lobloc     blob; --目标blob字段  v_blob_data  blob; --作为接受参数的字段,参数变量不能直接拿来赋值  v_amount     binary_integer; --总长度  v_sub_length binary_integer; --一次读取的最大长度,不超过32766  v_sub_blob   blob; --一次读取的子串  v_offset     binary_integer; --游标  v_err_msg    varchar2(1000); --测试用  v_id         binary_integer; --要修改或新增的记录ID  v_temp       binary_integer; --临时变量用于判断是否有v_id对应的记录begin  v_amount     := length(p_blob_data);  v_blob_data  := p_blob_data;  v_sub_length := 32767;  v_offset     := 1;  v_id         := p_id;  v_temp       := 0;  --execute immediate v_query_string into v_lobloc;  select count(1) into v_temp from a where id = v_id;  --查询是否有v_id对应的记录,并且赋值给v_temp  /*注意:无论是修改还是新增,blob字段都需要用empty_blob()进行初始化,否则后边的blob内容,不能写进表里*/  /***************************这里为了演示异常信息,把if else判断给注释掉了********************/  /*if v_temp = 0 then    insert into a (id, img) values (v_id, empty_blob()); --如果v_temp为0新增  else    update a set img = empty_blob() where id = v_id; --如果v_temp为1修改  end if;  */  commit;  select img into v_lobloc from a where id = v_id for update;  if v_amount > v_sub_length then    --dbms_lob.open(v_lobloc, dbms_lob.lob_readwrite);    while v_offset < v_amount loop      dbms_lob.read(v_blob_data, v_sub_length, v_offset, v_sub_blob); --把读到的内容放到v_sub_blob中      dbms_lob.writeappend(v_lobloc,                           --DBMS_LOB.GETLENGTH(v_sub_blob),                           length(v_sub_blob),                           v_sub_blob); --写入v_lobloc,该变量已经在之前和sql语句绑定      v_offset  := length(v_sub_blob) + v_offset; --游标移动      v_err_msg := length(v_lobloc);    end loop;  else    dbms_lob.writeappend(v_lobloc, v_amount, v_blob_data); --若是小鱼32766直接写入  end if;  commit;  dbms_lob.close(v_lobloc);exception  when others then    p_msg := sqlcode || sqlerrm;    --p_msg := v_err_msg;    rollback;end;

调用java代码

public static void main(String[] args) {		final Connection srcConn = DbUtil.getOracleConnection("c##sjzjy", "sjzjy", "192.168.23.60", "orcl");		final QueryRunner srcOracle = new QueryRunner();		final Connection wsConn = DbUtil.getOracleConnection("c##sjzjy", "sjzjy", "192.168.23.60", "orcl");		try {			srcOracle.query(srcConn, " select img from a where id = 1 ", new ResultSetHandler(){				@Override				public Img handle(ResultSet rs) throws SQLException {					while(rs.next()) {						Blob blob = rs.getBlob("IMG");						try {							String img = new String(blob.getBytes((long)1, (int)blob.length()), "ISO8859-1");//							String sql = "insert into a(img) values(?) ";//							PreparedStatement stmt = wsConn.prepareStatement(sql);//							stmt.setBytes(1, img.getBytes("ISO8859-1"));//							stmt.executeUpdate();							String sql = "call write2blob(?,?,?)";							CallableStatement ps = wsConn.prepareCall(sql);							ps.setInt(1, 8);							//ps.setBlob(2, blob);							ps.setBytes(2, img.getBytes("ISO8859-1"));							ps.registerOutParameter(3, Types.VARCHAR);							ps.execute();							String str = ps.getString(3);							System.out.println(str);						} catch (Exception e) {							e.printStackTrace();						} 					}					return null;				}});		} catch (Exception e) {			e.printStackTrace();		}	}

会在控制台输出异常编码和异常信息了

转载于:https://my.oschina.net/crazybird/blog/789796

你可能感兴趣的文章
SAP在阿里云白皮书-第三章 SAP上阿里云场景介绍
查看>>
asp.net C#后台实现下载文件的几种方法
查看>>
mysql之 xtrabackup原理、备份日志分析、备份信息获取
查看>>
线性查找算法(BFPRT)
查看>>
阿里云成为云原生计算基金会金牌会员
查看>>
C#中取得汉语拼音首字母
查看>>
SQLite查询优化(转)
查看>>
如何在ubuntu上安装virtualbox的driver module vboxdrv
查看>>
JAVA-1007. 素数对猜想 (20)
查看>>
IBM PowerAI编程大赛Q2场来袭!探秘金融语料大数据识别
查看>>
怎么用itunes来打开手机软件
查看>>
让ajax更加友好,实时显示后台处理进度。
查看>>
php加载memcache模块
查看>>
C#单例的多种写法
查看>>
为什么 muduo 的 shutdown() 没有直接关闭 TCP 连接?
查看>>
Android启示录——开始Android旅途
查看>>
ssh原始整合
查看>>
[Advance] How to debug a program (下):示例
查看>>
高级网络配置+Ipv6
查看>>
VMware ESXI虚拟机及虚拟系统修改MAC地址的方法
查看>>