当前位置: 首页 > 面试题库 >

使用JDBC连接到oracle从插入语句返回ROWID参数

武向文
2023-03-14
问题内容

我似乎无法获得正确的魔术组合来完成这项工作:

OracleDataSource ods = new oracle.jdbc.pool.OracleDataSource();
ods.setURL("jdbc:oracle:thin:app_user/pass@server:1521:sid");
DefaultContext conn = ods.getConnection();
CallableStatement st = conn.prepareCall("INSERT INTO tableA (some_id) VALUES (1) RETURNING ROWID INTO :rowid0");
st.registerReturnParameter(1, OracleTypes.ROWID);
st.execute();

我得到的错误是“违反协议”。如果更改为registerOutParameter(),则会收到通知我尚未注册所有返回变量。如果我将语句包装在PL /
SQL中,则开始;结束;
块,然后使用常规的registerOutParameter()调用即可得到参数。我真的更希望避免将我所有的insert语句包装在PL / SQL中-
上面缺少的是什么?


问题答案:

您需要做的几件事

  • 将CallableStatement更改为OracleCallableStatement
  • 尝试返回到NUMBER,即:OracleTypes.Number

用于从查询返回信息的示例代码:

OraclePreparedStatement pstmt = (OraclePreparedStatement)conn.prepareStatement(
       "delete from tab1 where age < ? returning name into ?");
pstmt.setInt(1,18);

/** register returned parameter
  * in this case the maximum size of name is 100 chars
  */
pstmt.registerReturnParameter(2, OracleTypes.VARCHAR, 100);

// process the DML returning statement
count = pstmt.executeUpdate();
if (count>0)
{
  ResultSet rset = pstmt.getReturnResultSet(); //rest is not null and not empty
  while(rset.next())
  {
    String name = rset.getString(1);
    ...
  }
}

有关Oracle JDBC扩展的更多信息:

  • http://download-uk.oracle.com/docs/cd/B19306_01/java.102/b14355/oraint.htm


 类似资料:
  • 我试图使用以下JDBC语句将一些值插入到来自Java的Oracle DB中: 序列创建如下: 我得到以下错误, 但当我尝试手动插入到表中时,它是成功的。 有什么问题?

  • 问题内容: 文件包含和及其说明(+ )。 是否可以依靠上述文件建立连接?(仅提供数据库名称即可): 为了找到该文件,我必须知道默认的Oracle主目录,我需要在Windows注册表中检入然后具有所有文件,然后检查哪个文件首先出现在上。有没有办法在客户端计算机上自动找到此文件? 问题答案: 我什至不知道可以在瘦驱动程序中使用tnsnames,但是显然它是在版本10中添加的: http://docs.

  • 问题内容: 我正在尝试从Java连接到Hive服务器1。很久以前我在这个论坛上发现了一个问题,但这对我不起作用。我正在使用此代码: 这就是指南中显示的代码。我已经在.java的同一路径中复制了hive- metastore,service,jdbc,exec,core和更多.jar。当我编译它时,我得到以下消息: 有人知道这里发生了什么吗? 问题答案: 尝试 代替 希望您在代码中添加了语句

  • 问题内容: 我用下面的代码连接在从Android系统。它仅显示catch部分中给出的操作。我不知道这是否是连接问题。 执行此代码后,它将在avd中显示“新”。 谁能提出一些解决方案?并预先感谢 问题答案: 您无法从本机访问MySQL数据库。编辑:实际上,您也许可以使用JDBC,但不建议使用(或可能不起作用?)…请参阅Android JDBC不起作用:驱动程序上的ClassNotFoundExcep

  • 问题内容: 我正在用Java开发与MySQL db通信的应用程序,而在测试它时,我注意到在表中插入新行的代码引发了MySQLSyntaxError异常,因此我尝试使用MySQL Workbench执行相同的INSERT,而且有效。有问题的代码是这样的: 编辑:对不起,堆栈跟踪是: 问题答案: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorExcep

  • 问题内容: 如您所知,ECMAscript会尝试变得聪明,如果您未明确编写 分号 ,则会自动插入 分号 。简单的例子 仍将按预期工作。但是,如果您依靠这一点,则有一些警告。如果我们像这样重写该函数 ..那个函数现在将返回,因为解释器将在语句之后插入分号(这就是为什么始终将大括号放在与语句相同的行上的原因)。 但是,了解了所有这些之后,我现在想知道在所有浏览器和版本中,如下所示的语句的 安全性 如何