2017-07-19 275 views
0

我正试图执行从休眠插入操作到oracle表中。 我的存储过程是: -传递日期作为存储过程中的参数(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; 

我打电话从休眠此过程中的操作方法: -

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 

回答

0

一个可能的解决方案是使用中的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())); 
相关问题