【问题标题】:Oracle JDBC insertion through stored procedure using Java使用 Java 通过存储过程插入 Oracle JDBC
【发布时间】:2011-12-21 07:19:39
【问题描述】:

我正在尝试使用 Java 在 Oracle 11g 中插入一条记录。我还在学习Java。

我必须调用存储过程来插入记录。我在用户表中的主键是 user_id。我还有一个在 user_id 上增加 2 的序列

现在,在 Java 中设置输入参数时,我需要在 user_id 中传递什么?另外,日期参数的类型是什么:

Users:user_id number (primary key), email varchar, created_date Date

我有下面的java代码:

        Class.forName("oracle.jdbc.OracleDriver");          
        Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@101.12.11.11:1521:demo", "demo_app", "demo");

        CallableStatement cs = conn.prepareCall("{exec demo.my_pkg.insert_users(?,?,?)}");
        cs.registerOutParameter(1, Types.INTEGER);
        cs.setInt(1, ?????);

        cs.execute();

我需要在这里设置 user_id 吗?如果是,我应该将它设置为什么,因为它是一个序列? 日期字段和电子邮件字段呢?

这里需要 registerOutParameter 吗?如果有,为什么?

最后,如何确认插入成功?

谢谢!

【问题讨论】:

    标签: java oracle


    【解决方案1】:
    1. 我需要在这里设置 user_id 吗? RE: 你可以在设置之前获取一个序列值:

      从对偶中选择 sequence_name.nextval

    2. 这里需要 registerOutParameter 吗?如果是这样,为什么? RE: 如果要获取返回值,可以注册OutParameter,如果没有,就算了。

    3. 如何确认插入成功? RE: 你可以从 out 参数或过程的返回值中获取结果

    【讨论】:

    • 我可以直接将序列作为 CallableStatement 传递 cs = conn.prepareCall("{exec demo.my_pkg.insert_users(seq_users.nextval,?,?)}");
    【解决方案2】:

    这里需要 registerOutParameter 吗?如果有,为什么?

    是的,如果您的存储过程返回任何值(即它是一个函数),您需要 registerOutParameter

    要设置日期字段,请使用 java.sql.Date 类作为类型。

    【讨论】:

      【解决方案3】:

      如果您在存储过程中没有触发/计算 user_id,那么,是的,您需要从 Java 代码中传递 user_id(在 Java 中获取下一个序列值,并将其传递给您的存储函数)。 如果您的函数返回值,则需要注册 out 参数。 确认取决于实施。例如,如果您的函数返回是否是用户插入的,只需检查返回值。

      【讨论】:

      • 如果我有序列触发器怎么办?我需要在参数中传递什么?
      • 在这种情况下,user_id 是在您的数据库中生成的,您不应从 java 传递它。如果你有触发器,为什么你的存储过程中有 user_id 参数?
      猜你喜欢
      • 1970-01-01
      • 2012-01-05
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      相关资源
      最近更新 更多