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<Img>(){
@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();
}
}

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

oracle存储过程获取异常信息码和异常信息的更多相关文章

  1. Oracle存储过程获取YYYY-MM-DD的时间格式

    环境:Oracle 10g,11g 问题重现:PL/SQL中命令窗口下,发现存储过程得到的时间格式不符合预期要求. SQL> select sysdate from dual; SYSDATE ...

  2. Oracle EBS 获取完全的值集信息

    SELECT fvs1.flex_value_set_name, fvs1.description, decode(upper(fvs1.longlist_flag), 'N', '值列表', 'Y' ...

  3. Oracle存储过程中异常Exception的捕捉和处理

    Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...

  4. Python中获取异常(Exception)信息

    异常信息的获取对于程序的调试非常重要,可以有助于快速定位有错误程序语句的位置.下面介绍几种python中获取异常信息的方法,这里获取异常(Exception)信息采用try...except...程序 ...

  5. 存储过程——异常捕获&打印异常信息

    目录 0. 背景说明 1. 建立异常信息表ErrorLog 2. 建立保存异常信息的存储过程 3. 建立在SQL Server中打印异常信息的存储过程 4. 建立一个用于测试的存储过程抛出异常进行测试 ...

  6. Oracle存储过程记录异常日志

    一般我们会将一些涉及到数据库的定时任务直接用存储过程搞定,省去了后端代码的开发.部署,简单.快速,但这种方式存在一个弊端——当存储过程执行出错了,我们无法感知.解决办法也简单,学代码那样去捕获异常.打 ...

  7. Oracle PL/SQL 非预定义异常、自定义异常处理、RAISE_APPLICATION_ERROR

    抛出异常 Oracle有三种类型的异常错误: 1. 预定义(Predefined)异常 ORACLE预定义的异常情况大约有24个.对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发. ...

  8. [推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)

    原文:[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不殆) [推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/S ...

  9. springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑。为了区别不同的异常通常根据异常类型自定义异常类,这里我们创建一个自定义系统异常,如果controller、service、dao抛出此类异常说明是系统预期处理的异常信息。

    springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑. 1.1 异常处理思路 系统中异常包括两类:预期异常和运行时异常RuntimeEx ...

随机推荐

  1. python基础-类的反射

    1)反射是通过字符串方式映射内存中的对象. python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr, 改四个函数分别用于对对象内部执行:检查是 ...

  2. Isolate randomforest检测异常点的非监督方法

    由于异常数据的两个特征(少且不同: few and different) 异常数据只占很少量; 异常数据特征值和正常数据差别很大. iTree的构成过程如下: l  随机选择一个属性Attr: l  ...

  3. 网络协议之NAT穿透

    NAT IPv4地址只有32位,最多只能提供大致42.9亿个唯一IP地址,当设备越来越多时,IP地址变得越来越稀缺,不能为每个设备都分配一个IP地址.于是,作为NAT规范就出现了.NAT(Networ ...

  4. Linux系统的优势

    熟悉电脑的人都知道,Linux 相比较于 Windows 有着众多的优势,所以现在越来越多的电脑用户开始使用 Linux 进行办公.学习.总体来讲,Linux 的优势主要有以下几个方面. 一.开源.免 ...

  5. Signalr信息推送

    前序 距离上次写文章,差不多已经大半年了.感觉自己越来越懒了,即使有时候空闲下来了,也不想动.前面买了一系列的Python的书,基础的看了大概有四分之一,剩下的基本上还未动,晚上回去也只是吃饭看电影. ...

  6. Loadrunner11之禁用/启用Action

    Loadrunner11之禁用/启用Action   大家在用Loadrunner11录制脚本的时候,会产生多个action,比如login, search, logout.在调试脚本的时候,我不想从 ...

  7. LeetCode 80. 删除排序数组中的重复项 II

    LeetCode 80. 删除排序数组中的重复项 II

  8. 001 Java 深拷贝、浅拷贝及Cloneable接口

    原本写过,后来在阅读的时候,感觉自己都不是太明白了,删除后参考人家的又重新写了一份. 一:开篇 1.复制一个变量 举例是int类型. 其他其中七种原始数据类型同样适用. 原始类型:boolean,ch ...

  9. vim中E121:无法打开并写入文件解决办法

    1.使用命令  :w !sudo tee % 保存即可. 其中: 冒号(:)表示我们处于vim的退出模式: 感叹号(!)表示我们正在运行shell命令: sudo和tee都是shell命令: %表示从 ...

  10. Failed to load JavaHL Library. SVN

    以前使用的电脑是32位的,安装的svn可以正常使用,但是现在的电脑室64位的,安装好svn后,把项目提交到svn的过程中,总是弹出来一个错误的对话框: Failed to load JavaHL Li ...