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

2lpgd968  于 2022-11-03  发布在  Oracle
关注(0)|答案(1)|浏览(623)

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

  1. create or replace PROCEDURE ADMSN_TABLE (
  2. P_ID NUMBER,
  3. P_ADMISSIONFOR VARCHAR2,
  4. P_SUBMISSIONDATE DATE, --NOT NULL
  5. P_SUBMISSIONLASTDATE DATE --NOT NULL
  6. )
  7. IS
  8. v_sno number;
  9. BEGIN
  10. INSERT INTO ORACLE.ADMISSION(AMSNID,ADMISSIONFOR,SUBMISSIONDATE,
  11. SUBMISSIONLASTDATE)
  12. VALUES (P_ID,P_ADMISSIONFOR,P_SUBMISSIONDATE,P_SUBMISSIONLASTDATE);
  13. COMMIT;
  14. END;

我从休眠中调用这个过程的方式:

  1. public void callProc(){
  2. Date utilDate= new Date();
  3. java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
  4. System.out.println(sqlDate);
  5. Date date = new Date();
  6. SimpleDateFormat smd = new SimpleDateFormat("dd-MMM-YYYY");
  7. String sdate = smd.format(date);
  8. System.out.println(sdate);
  9. try {
  10. session = sessionFactory.openSession();
  11. transaction = session.beginTransaction();
  12. StoredProcedureQuery query = session.createStoredProcedureQuery("ADMSN_TABLE");
  13. query.registerStoredProcedureParameter("P_ID", Number.class,
  14. ParameterMode.IN);
  15. query.registerStoredProcedureParameter("P_ADMISSIONFOR", String.class,
  16. ParameterMode.IN);
  17. query.registerStoredProcedureParameter("P_SUBMISSIONDATE", Date.class,
  18. ParameterMode.IN);
  19. query.registerStoredProcedureParameter("P_SUBMISSIONLASTDATE",Date.class,
  20. ParameterMode.IN);
  21. query.setParameter("P_ID", 1);
  22. query.setParameter("P_ADMISSIONFOR", "schoolfee");
  23. query.setParameter("P_SUBMISSIONDATE", sqlDate);
  24. query.setParameter("P_SUBMISSIONLASTDATE", sqlDate);
  25. query.execute();
  26. System.out.println("excuted");
  27. }catch(Exception ex){
  28. ex.printStackTrace();
  29. }
  30. }
  31. }

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

  1. Caused by: org.hibernate.exception.SQLGrammarException:
  2. Error calling CallableStatement.getMoreResults at
  3. org.hibernate.exception.internal.SQLStateConversionDelegate.convert
  4. (SQLStateConversionDelegate.java:106) at
  5. org.hibernate.exception.internal.StandardSQLExceptionConverter.convert
  6. (StandardSQLExceptionConverter.java:42) at
  7. org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert
  8. (SqlExceptionHelper.java:111)
  9. at org.hibernate.result.internal.OutputsImpl.convert
  10. at org.hibernate.result.internal.OutputsImpl.<init>
  11. (OutputsImpl.java:55)
  12. at org.hibernate.procedure.internal.ProcedureOutputsImpl.<init>
  13. (ProcedureOutputsImpl.java:32)
  14. at org.hibernate.procedure.internal.ProcedureCallImpl.buildOutputs
  15. (ProcedureCallImpl.java:453)
  16. at org.hibernate.procedure.internal.ProcedureCallImpl.getOutputs
  17. (ProcedureCallImpl.java:404)
  18. at org .hibernate.procedure.internal.ProcedureCallImpl.outputs
  19. (ProcedureCallImpl.java:663)
  20. at org.hibernate.procedure.internal.ProcedureCallImpl.execute
  21. (ProcedureCallImpl.java:646)
  22. ... 41 more
  23. Caused by: java.sql.SQLException: ORA-06550: line 1, column 7:
  24. PLS-00306: wrong number or types of arguments in call to 'ADMSN_TABLE'
  25. ORA-06550: line 1, column 7:
  26. PL/SQL: Statement ignored
mzmfm0qo

mzmfm0qo1#

一种可能的解决方案是使用java.sql.timestamp,而不是java. sql. Date。此外,您还可以参考SQL和PL/SQL与Oracle和JDBC类型的Map,以验证数据类型Map是否正确。
这是一个如何获取java.sql.timestamp的示例

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

相关问题