java - 将日期作为存储过程中的参数传递(oracle)

标签 java oracle hibernate stored-procedures

我正在尝试从 hibernate 执行插入操作到 oracle 表。 我的存储过程是:-

create or replace PROCEDURE          ADMSN_TABLE (
  P_ID                            NUMBER,
  P_ADMISSIONFOR                  VARCHAR2,
  P_SUBMISSIONDATE                DATE,                            --NOT NULL
  P_SUBMISSIONLASTDATE            DATE                          --NOT NULL

)
IS
  v_sno number;

  BEGIN
      INSERT INTO ORACLE.ADMISSION(AMSNID,ADMISSIONFOR,SUBMISSIONDATE,
 SUBMISSIONLASTDATE)
      VALUES (P_ID,P_ADMISSIONFOR,P_SUBMISSIONDATE,P_SUBMISSIONLASTDATE);

      COMMIT;
  END;

我从 hibernate 状态调用此过程的方式:-

    public void callProc(){

        Date utilDate= new Date();
        java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
        System.out.println(sqlDate);


        Date date = new Date();
        SimpleDateFormat smd = new SimpleDateFormat("dd-MMM-YYYY");
        String sdate = smd.format(date);
        System.out.println(sdate);

    try {
    session = sessionFactory.openSession();
    transaction = session.beginTransaction();
    StoredProcedureQuery query = session.createStoredProcedureQuery("ADMSN_TABLE");
query.registerStoredProcedureParameter("P_ID", Number.class, 
ParameterMode.IN);
query.registerStoredProcedureParameter("P_ADMISSIONFOR", String.class, 
ParameterMode.IN);
query.registerStoredProcedureParameter("P_SUBMISSIONDATE", Date.class, 
ParameterMode.IN);             
query.registerStoredProcedureParameter("P_SUBMISSIONLASTDATE",Date.class, 
ParameterMode.IN);

            query.setParameter("P_ID", 1);
            query.setParameter("P_ADMISSIONFOR", "schoolfee");
            query.setParameter("P_SUBMISSIONDATE", sqlDate);
            query.setParameter("P_SUBMISSIONLASTDATE", sqlDate);
            query.execute();
            System.out.println("excuted");
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
}

现在我尝试将日期参数作为 new Date()sqldate 传递,如上面给出的。和 query.setParameter("P_SUBMISSIONLASTDATE", sqlDate,TemporalType.Date); 但它们都抛出错误:-

Caused by: org.hibernate.exception.SQLGrammarException: 
Error calling CallableStatement.getMoreResults at 
org.hibernate.exception.internal.SQLStateConversionDelegate.convert
(SQLStateConversionDelegate.java:106) at 
org.hibernate.exception.internal.StandardSQLExceptionConverter.convert
(StandardSQLExceptionConverter.java:42) at 
org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert
(SqlExceptionHelper.java:111)
at org.hibernate.result.internal.OutputsImpl.convert
at org.hibernate.result.internal.OutputsImpl.<init>
(OutputsImpl.java:55)
at org.hibernate.procedure.internal.ProcedureOutputsImpl.<init>
(ProcedureOutputsImpl.java:32)
at org.hibernate.procedure.internal.ProcedureCallImpl.buildOutputs
(ProcedureCallImpl.java:453)
at org.hibernate.procedure.internal.ProcedureCallImpl.getOutputs
(ProcedureCallImpl.java:404)
    at org .hibernate.procedure.internal.ProcedureCallImpl.outputs
(ProcedureCallImpl.java:663)
    at org.hibernate.procedure.internal.ProcedureCallImpl.execute
(ProcedureCallImpl.java:646)
    ... 41 more
Caused by: java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'ADMSN_TABLE'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

最佳答案

一种可能的解决方案是使用 java.sql.timestamp 而不是 java.sql.Date。也可以引用SQL and PL/SQL Mappings to Oracle and JDBC Types以验证正确的数据类型映射。

This is an example of how get java.sql.timestamp

java.util.Date utilDate = new java.util.Date();
Calendar cal = Calendar.getInstance();
cal.setTime(utilDate);
cal.set(Calendar.MILLISECOND, 0);
System.out.println(new java.sql.Timestamp(utilDate.getTime()));
System.out.println(new java.sql.Timestamp(cal.getTimeInMillis()));

关于java - 将日期作为存储过程中的参数传递(oracle),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45179935/

相关文章:

java - JDBC ResultSet.getWarnings

c - 用于 Oracle 数据库访问的线程安全全局 sqlca 结构

java - Hibernate 中用于自动递增 MySQL 主键的 Java 注释是什么 - @Id

java - 使用 JPA/hibernate 在数据库表中手动维护实体行版本/历史记录

java - 如何将配置xml文件从WEB-INF移动到java spring中的资源?

java - Tomcat 6、JMX 和动态端口问题

java - 如何使用 JScrollPane 和 JLayeredPane 创建钢琴

java - 用于 DB2 和 Oracle 数据源的 flexypool

KML 的 Java API (JAK) - 删除 kml 中额外的 ns2 注释

java - 此模式的正则表达式