oracle存储过程获取异常信息码和异常信息
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存储过程获取异常信息码和异常信息的更多相关文章
- Oracle存储过程获取YYYY-MM-DD的时间格式
环境:Oracle 10g,11g 问题重现:PL/SQL中命令窗口下,发现存储过程得到的时间格式不符合预期要求. SQL> select sysdate from dual; SYSDATE ...
- Oracle EBS 获取完全的值集信息
SELECT fvs1.flex_value_set_name, fvs1.description, decode(upper(fvs1.longlist_flag), 'N', '值列表', 'Y' ...
- Oracle存储过程中异常Exception的捕捉和处理
Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...
- Python中获取异常(Exception)信息
异常信息的获取对于程序的调试非常重要,可以有助于快速定位有错误程序语句的位置.下面介绍几种python中获取异常信息的方法,这里获取异常(Exception)信息采用try...except...程序 ...
- 存储过程——异常捕获&打印异常信息
目录 0. 背景说明 1. 建立异常信息表ErrorLog 2. 建立保存异常信息的存储过程 3. 建立在SQL Server中打印异常信息的存储过程 4. 建立一个用于测试的存储过程抛出异常进行测试 ...
- Oracle存储过程记录异常日志
一般我们会将一些涉及到数据库的定时任务直接用存储过程搞定,省去了后端代码的开发.部署,简单.快速,但这种方式存在一个弊端——当存储过程执行出错了,我们无法感知.解决办法也简单,学代码那样去捕获异常.打 ...
- Oracle PL/SQL 非预定义异常、自定义异常处理、RAISE_APPLICATION_ERROR
抛出异常 Oracle有三种类型的异常错误: 1. 预定义(Predefined)异常 ORACLE预定义的异常情况大约有24个.对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发. ...
- [推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)
原文:[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不殆) [推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/S ...
- springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑。为了区别不同的异常通常根据异常类型自定义异常类,这里我们创建一个自定义系统异常,如果controller、service、dao抛出此类异常说明是系统预期处理的异常信息。
springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑. 1.1 异常处理思路 系统中异常包括两类:预期异常和运行时异常RuntimeEx ...
随机推荐
- JDBC核心API
JDBC核心API在java.sql.*和javax.sql.* 1.Driver接口:表示Java驱动程序接口,具体的数据库厂商要实现其此接口 connect(url.propertis):连接数据 ...
- Linux基础入门学习笔记之四
环境变量与文件查找 环境变量 变量 所谓shell变量,就是计算机中用于记录一个值(不一定是数值,也可以是字符或字符串)的符号,而这些符号将用于不同的运算处理中.通常变量与值是一对一的关系,可以通过表 ...
- Kubernetes Ingress实战
本节内容: 服务发现与负载均衡 Ingress实战 一.服务发现与负载均衡 在前面的安装部署kubernetes集群中已经简单用示例来演示了Pod和Service,Kubernetes通过Servic ...
- 《精通Python设计模式》学习之抽象工厂
这种工厂模式用得少, 可能在游戏类的编程中用得比较多吧. 这个思路清晰一定要OK的. class Frog: def __init__(self, name): self.name = name de ...
- GUC-7 同步锁 Lock
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /* * 一.用于解决 ...
- scrapy中对于item的把控
其实很简单,就是想要存储的位置发生改变.直接看例子,然后触类旁通. 以大众点评 评论的内容为例 ,位置:http://www.dianping.com/shop/77489519/review_mor ...
- htm5本地存储方案——indexdb的封装
不BB直接上代码 /*封装IndexdDB*/ var localDatabase = { }; localDatabase.dbName = "yiliDB"; localDat ...
- GPL、BSD和Apache开源许可证
参考资料 五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT) 如何选择开源许可证? - 阮一峰的网络日志 开源许可证教程 - 阮一峰的网络日志 简介 自由软件许可证由FSF(Free ...
- NetCore+Dapper WebApi架构搭建(三):添加实体和仓储
上一节讲了类库添加一些底层的基本封装,下面来添加实体和仓储 1.Entities文件夹添加一个实体类Users,继承BaseModel,即拥有BaseModel的主键 using System; na ...
- golang make()的第三个参数
golang分配内存有一个make函数,该函数第一个参数是类型,第二个参数是分配的空间,第三个参数是预留分配空间,前两个参数都很好理解, 对于第三个参数,例如a:=make([]int, 5, 10) ...