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

會在控制台輸出異常編碼和異常信息了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM