首页 > 解决方案 > Oracle OCI jdbc 驱动程序陷阱 ORA-01403: 未找到数据

问题描述

我遇到了 Oracle OCI jdbc 驱动程序没有抛出 ORA-01403 No data found 异常的问题。与 Oracle 11 和 12 相关。也许我需要在 Connection 对象上设置一个属性或一些东西。瘦驱动程序正确地引发异常,但 OCI 驱动程序只是继续没有错误并更新 0 行,即使表中有数据。

以下程序的输出是:

THIN 驱动程序抛出异常:ORA-01403:未找到数据 ORA-06512:在“EE.TABLEX_UPSERT_PRE”,第 4 行 ORA-04088:执行触发器“EE.TABLEX_UPSERT_PRE”期间出错

从 OCI 驱动程序更新的行 =0

public static void main(String[] args) {
    try {
        Driver d = (Driver) Class.forName("oracle.jdbc.OracleDriver").newInstance();
        Properties info = new Properties();
        info.put("user", "me");
        info.put("password", "mypwd");

        Connection thinConnection = d.connect("jdbc:oracle:thin:@host:1521:DEV",info);
        Connection ociConnection = d.connect("jdbc:oracle:oci:@DEV",info);

        try {
            Statement s = thinConnection.createStatement();
            s.execute("UPDATE tablex SET name='newname'");
            System.out.println("rows updated in THIN Driver =" + s.getUpdateCount());
        }
        catch (SQLException e) {
            System.out.println("Exception thrown from THIN Driver: " + e.getMessage());
        }
        try {
            Statement s = ociConnection.createStatement();
            s.execute("UPDATE tablex SET name='newname'");
            System.out.println("rows updated from OCI Driver =" + s.getUpdateCount());
        }
        catch (SQLException e) {
            System.out.println("Exception thrown from OCI Driver: " + e.getMessage());
        }
    }
    catch (Exception e) {
        e.printStackTrace();
    }
    System.exit(0);
}

{////// SQL
CREATE TABLE TABLEX 
(
  NAME VARCHAR2(20) 
);

INSERT INTO TABLEX(name) values('data1');


CREATE TABLE TABLEy
(
  ID NUMBER 
);



create or replace 
TRIGGER TABLEX_UPSERT_PRE 
BEFORE INSERT OR UPDATE ON TABLEX FOR EACH ROW 
DECLARE 
cid number;
BEGIN 
select id into cid from tabley where id=0; -- INTENTIONAL No Data Found error
end;
}

标签: oraclejdbcoracle-call-interface

解决方案


推荐阅读