通过JDBC调用的匿名块执行时没有错误但不运行

时间:2011-06-08 21:01:22

标签: java sql oracle jdbc

可能在这里遗漏了一些微不足道的东西,但我在Oracle 10g上运行的Java应用程序中有一个函数,它在BEGIN中生成一堆insert和delete语句......;结束;块。

当我执行该语句时,它运行时没有错误,但是没有将值插入/删除到数据库中。如果我将要运行的SQL复制到SQL开发人员并执行它,它将按预期工作。

示例SQL ...

BEGIN
  INSERT INTO tablea_archive (col1,col2,col3)
  SELECT col1,col2,col3 FROM tablea;
  DELETE FROM tablea;
  INSERT INTO tableb_archive (col1,col2,col3)
  SELECT col1,col2,col3 FROM tableb;
  DELETE FROM tableb;
END;

我尝试使用execute()和executeUpdate()通过准备好的,callabale和普通语句运行代码,但没有快乐。

有谁可以指出我做错了什么?

2 个答案:

答案 0 :(得分:1)

我会尝试像

这样的东西
BEGIN
  INSERT INTO tablea_archive (col1,col2,col3)
  SELECT col1,col2,col3 FROM tablea;
  RAISE_APPLICATION_ERROR(-20001,'Inserted '||sql%rowcount||' rows');
END;

您的错误处理应该为您提供某种形式的消息,说明插入INSERT的行数。如果您没有错误记录,请查看recording errors on the database end

我怀疑数据库错误或架构错误。

答案 1 :(得分:0)

此代码段有效。可能它可以帮助你:

String  plsql = "BEGIN :myresult := dbms_random.random ; END;";
OracleDriver oracledrv = new OracleDriver();
Connection   con = oracledrv.connect(connstr, new Properties());

for (int i = 0 ; i < 1000 ; i++ ) {
    CallableStatement cb = con.prepareCall(plsql);
    cb.registerOutParameter("myresult", Types.INTEGER);
    cb.execute();
    System.out.println("random ->" +cb.getInt("myresult"));
    cb.close();
}
con.close();