|
1.按F8或是菜单栏第三行第二个执行按键编译存储过程。此时,如果有语法上的明显错误,plsql会给予提示。? 2.在procedures中找到要调试的存储过程,右键,选测试。注意,要记得勾选添加调试信息啊。?
 ? 3.打开调试窗口,填写输入参数? 4.点测试窗口的调试按键(如图中画圈的位置)开始调试?

5.逐步调试,如下图:?

图中1:点击单步调试,主要就是使用这个来进行调试。执行到的代码会高亮显示,此外,注意图中4的位置,可以在这里输入变量的名字,来查看变量的当前值。? 图中2/3:分别为跳出单步执行和全部执行,调试时不推荐使用。
单步调试过程中,如果执行到哪一步直接跳转到了exception结束,那么,就是这一步出来问题,可以记住这个位置,再次调试,通过查看这附近变量的值,以及查看错误日志记录的错误详情,来确认出错的具体原因并进行修改。
四.在java中调用
存储过程调试好之后,就可以在java中调用该存储过程。
-
?
logger
.info("调用存储过程p_contract_purchase_import");
-
?
//存储过程名称。有多少个传入参数打几个问号(包括v_o_ret)
-
?
String procName=
"{Call p_contract_purchase_import(?,?,?) }";
-
?
DataSource ds = SessionFactoryUtils
.getDataSource(this.getHibernateTemplate().getSessionFactory());
-
?
Connection conn =
null;
-
?
CallableStatement
call = null;
-
?
//ResultSet rs =null;
-
?
?
-
?
try
-
?
{
-
?
//创建连接
-
?
conn = ds
.getConnection();
-
?
call = conn.prepareCall(procName);
-
?
//传入数据
-
?
call.setString(1,(importList.get(0)).trim());
-
?
if(ratio_amount==null) {
-
?
call.setString(2,null);
-
?
}
else {
-
?
call.setLong(2,ratio_amount);
-
?
}
-
?
call.setString(3,(importList.get(2)).trim());
-
?
?
-
?
//第四个参数是作为返回值存在的
-
?
call.registerOutParameter(4,Types.BIGINT);
-
?
//执行存储过程
-
?
call.executeUpdate();
-
?
//获取返回的结果
-
?
ret = call.getInt(17) ;
-
?
logger
.info("ret:"+ret); ;//call.getInt(6));
-
?
?
-
?
try
-
?
{
-
?
//关闭连接
-
?
call.close();
-
?
call = null ;
-
?
conn
.close();
-
?
conn =
null ;
-
?
}
catch (SQLException e) {
-
?
// TODO Auto-generated catch block
-
?
}
-
?
?
-
?
}
catch (SQLException e){
-
?
logger
.error("打开存储过程错误:",e);
-
?
}
-
?
finally{
-
?
try {
-
?
if (call != null) {
-
?
call.close();
-
?
}
-
?
if (conn != null) {
-
?
conn
.close();
-
?
}
-
?
}
catch (SQLException e) {
-
?
// TODO Auto-generated catch block
-
?
conn =
null;
-
?
}
-
?
}
需要注意的是,call.setLong()不可以传入空值。如果内容有可能为空的话,set之前需要判断是否为空,不为空才能使用setLong()方法,否则,要使用setString方法。
?
五:注意事项:
- 存储过程参数不带取值范围,in表示传入,out表示输出
- 变量带取值范围,后面接分号
- 在判断语句前最好先用count(*)函数判断是否存在该条操作记录
- 用select … into … 给变量赋值
- 在代码中抛异常用 raise+异常名
已命名的异常:
命名的系统异常 |
产生原因 |
|