当前位置:首页 » 存储配置 » oracle存储过程异常处理

oracle存储过程异常处理

发布时间: 2023-09-10 00:30:29

‘壹’ oracle 存储过程异常处理

先建一个错误跟踪表
create sequence s_error_id;
CREATE TABLE ERROR_RECORD
(
ERROR_ID NUMBER(10) primary key,
ERROR_CODE NUMBER(10),
ERROR_MSG VARCHAR2(2000),
ERROR_DATE DATE,
ERROR_PROGRAM VARCHAR2(200)
);
--------在过程的例外里向跟踪表写入错误信息:
create or replace procere day_task is
v_sqlcode ERROR_RECORD.ERROR_CODE%type;
v_msg ERROR_RECORD.error_msg%type;
begin
------program body
exception when others then
--记录错误信息表
v_sqlcode :=sqlcode;
v_msg :=sqlerrm;
insert into error_record(error_code,error_msg,error_date,error_program)
values (v_sqlcode,v_msg,sysdate,‘day_task’);
end;

‘贰’ 请教各位高手 oracle 存储过程 如何获得 捕获异常的内容

--通过sqlcode , sqlerrm 这两个内置变量来查看,例如:

DECLARE
--声明异常
some_kinds_of_err EXCEPTION; -- Exception to indicate an error condition

v_ErrorCode NUMBER; -- Variable to hold the error message code
v_ErrorText VARCHAR2(200); -- Variable to hold the error message text

BEGIN
--...
--抛出异常
IF ( ... ) THEN --(括号内填抛出异常的条件)
RAISE some_kinds_of_err;
END IF;
--...
EXCEPTION
--捕捉异常
WHEN some_kinds_of_err THEN
/* do something to Handler the errors */
null;
--捕捉其他异常,并获得 捕获异常的内容
WHEN OTHERS THEN
v_ErrorCode := SQLCODE;
v_ErrorText := SUBSTR(SQLERRM, 1, 200);
-- Note the use of SUBSTR here.

dbms_output.put_line(v_ErrorCode || '::'||v_ErrorText);
END;
/

/**
sqlcode 就是错误代码
sqlerrm 就是sql错误信息。注意用substr来截取,否则输出很难看。

**/

‘叁’ oracle 存储过程中出现异常的处理

异常是执行这个存储过程出的异常吧,那就是说只有执行一次这个存储过程才会抛一次异常么?如果这样我建议你可以再写个存储过程来调用你这个存储过程,这样来记录异常的次数。然后再进行处理!

‘肆’ Oracle 存储过程 如何实现插入数据时出错后,但还继续执行

begin
insert …… ;--可能出错的地方
exception
when others then
null;--出错后跳到这里来。

end;

将可能出错语句包裹起来,抓异常,不影响往下执行。

‘伍’ 请教各位高手 oracle 存储过程 如何将获得捕获异常的内容写入一张表里

可以先定义个变量,发生异常的时候将异常信息赋值给变量,插入表的时候用变量,
日志表没给表结构,我自己重新定义了一个,测试ok。
CREATE TABLE T_LOG_ERROR
(ERR_ID NUMBER,
ERR_TIME DATE,
ERR_CODE NUMBER,
ERR_INFOR VARCHAR2(4000)
);

create or replace procere p_testone is
v number(2);
v_sqlcode number;
v_sqlerrm varchar2(4000);
begin
select 1 / 0 into v from al;

--异常处理
EXCEPTION WHEN OTHERS THEN
ROLLBACK;
v_sqlcode :=sqlcode;
v_sqlerrm :=SUBSTR(sqlerrm, 1, 2000);
insert into t_log_error values(1,sysdate,v_sqlcode,v_sqlerrm);
commit;
DBMS_OUTPUT.PUT_LINE(SUBSTR(SQLERRM, 1, 200));
end;

执行存储过程后就可以把异常信息记录到表t_log_error了。

‘陆’ java连接Oracle调用存储过程提示实际返回的行数超出请求的行数异常,怎么解决

package com.yc.ycportal.ge.util;import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;import com.mysql.jdbc.ResultSet;public class TestOracle { private Connection conn=null;
private CallableStatement call=null;
private ResultSet rs=null; public TestOracle() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
setConn();
}
catch (ClassNotFoundException ex) {
}
} public void setConn(){
String url="jdbc:oracle:thin:@localhost:1521:hy";
try {
conn = DriverManager.getConnection(url, "system", "manager");
System.out.println("conn ok");
}
catch (SQLException ex) {
}
} public void closeConn(){
if(conn!=null){
try {
conn.close();
System.out.println("conn close");
}
catch (SQLException ex) {
}
}
} //调用单独的具有输出参数的过程
public void testShuchu(int salary ){
//实例化cal
try {
//cal = conn.prepareCall("{call hr.shuchu(?,?)}");
call=conn.prepareCall("begin hr.shuchu(?,?); end;");
call.setInt(1,salary);
//注册输出参数
//cal.registerOutParameter(2,java.sql.Types.VARCHAR);
call.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR);
call.execute();
//获得输出参数
// String str=cal.getString(2);
String str=(String)call.getObject(2);
System.out.println(str);
}
catch (SQLException ex) {
}
finally{
try {
call.close();
}
catch (SQLException ex1) {
}
} }// 调用函数
public void testHanshu(int num1,int num2){
try {
call = conn.prepareCall("begin ?:=hr.mypack.myfunc(?,?); end;");
call.setInt(2,num1);
call.setInt(3,num2);
call.registerOutParameter(1,oracle.jdbc.OracleTypes.NUMBER);
call.execute();
int num = call.getInt(1);
System.out.println(num);
}
catch (SQLException ex) {
}
finally{
try {
call.close();
}
catch (SQLException ex1) {
}
} }// 调用游标
public void testRs(int salary){
try {
call = conn.prepareCall("begin hr.mypack.shuchu(?,?); end;");
call.setInt(1,salary);
call.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);
call.execute();
rs=(ResultSet)call.getObject(2); if(rs!=null){
while (rs.next()) {
System.out.println(rs.getString(2));
}
}
else{
System.out.println("查无结果");
}
}
catch (SQLException ex) {
}
finally{
try {
rs.close();
call.close();
}
catch (SQLException ex1) {
} }
}
public static void main(String[] args) {
TestOracle dbUtil1 = new TestOracle();
dbUtil1.testRs(420);
}}package com.yc.ycportal.ge.util;import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;import com.mysql.jdbc.ResultSet;public class TestOracle { private Connection conn=null;
private CallableStatement call=null;
private ResultSet rs=null; public TestOracle() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
setConn();
}
catch (ClassNotFoundException ex) {
}
} public void setConn(){
String url="jdbc:oracle:thin:@localhost:1521:hy";
try {
conn = DriverManager.getConnection(url, "system", "manager");
System.out.println("conn ok");
}
catch (SQLException ex) {
}
} public void closeConn(){
if(conn!=null){
try {
conn.close();
System.out.println("conn close");
}
catch (SQLException ex) {
}
}
} //调用单独的具有输出参数的过程
public void testShuchu(int salary ){
//实例化cal
try {
//cal = conn.prepareCall("{call hr.shuchu(?,?)}");
call=conn.prepareCall("begin hr.shuchu(?,?); end;");
call.setInt(1,salary);
//注册输出参数
//cal.registerOutParameter(2,java.sql.Types.VARCHAR);
call.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR);
call.execute();
//获得输出参数
// String str=cal.getString(2);
String str=(String)call.getObject(2);
System.out.println(str);
}
catch (SQLException ex) {
}
finally{
try {
call.close();
}
catch (SQLException ex1) {
}
} }// 调用函数
public void testHanshu(int num1,int num2){
try {
call = conn.prepareCall("begin ?:=hr.mypack.myfunc(?,?); end;");
call.setInt(2,num1);
call.setInt(3,num2);
call.registerOutParameter(1,oracle.jdbc.OracleTypes.NUMBER);
call.execute();
int num = call.getInt(1);
System.out.println(num);
}
catch (SQLException ex) {
}
finally{
try {
call.close();
}
catch (SQLException ex1) {
}
} }// 调用游标
public void testRs(int salary){
try {
call = conn.prepareCall("begin hr.mypack.shuchu(?,?); end;");
call.setInt(1,salary);
call.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);
call.execute();
rs=(ResultSet)call.getObject(2); if(rs!=null){
while (rs.next()) {
System.out.println(rs.getString(2));
}
}
else{
System.out.println("查无结果");
}
}
catch (SQLException ex) {
}
finally{
try {
rs.close();
call.close();
}
catch (SQLException ex1) {
} }
}
public static void main(String[] args) {
TestOracle dbUtil1 = new TestOracle();
dbUtil1.testRs(420);
}}

‘柒’ oracle存储过程中 未找到数据 异常的问题。。。

解决这个办法很多,按提问者的意思,异常肯定是no
data
found,这个时候你需要检查在哪出现的这个异常,如果数据不多的话,你可以用一条一条记录的去试,如果数据量大的话那直接在每个select前先选出count(*)
into
counts,当
counts<>
0的时候再让它执行下边的语句,或者直接存储工程中加异常处理的语句,我一般遇到这种情况都是用第一种,很简单但是很实用,屡试不爽。哈哈,如果有机会再交流交流

热点内容
鹦鹉linux 发布:2025-01-25 03:44:02 浏览:196
python如何抛出异常 发布:2025-01-25 03:40:27 浏览:984
更新成本算法 发布:2025-01-25 03:38:09 浏览:115
我的世界在服务器里面用toolbox 发布:2025-01-25 03:38:09 浏览:566
学编程不想学了 发布:2025-01-25 03:36:51 浏览:379
如何压缩0 发布:2025-01-25 03:36:49 浏览:794
服务器主板和家用电脑主板的区别 发布:2025-01-25 03:36:47 浏览:893
查询数据库连接数 发布:2025-01-25 03:36:41 浏览:976
安卓锁屏切换在哪里 发布:2025-01-25 03:30:56 浏览:220
aspx代码加密 发布:2025-01-25 03:28:09 浏览:925