java - 如何使用hibernate native sql查询将对象列表传递给oracle中的存储过程

标签 java oracle hibernate

我正在使用 hibernate 连接到 Oracle 数据库。

我需要调用一个以对象类型作为输入参数的存储过程。

CREATE OR REPLACE TYPE FIN_GM_WALK_MAN_ADJ_TYPE AS OBJECT
(
  ROW_NUM                     NUMBER,
  IMPACT_TYPE_CD              VARCHAR2(20 BYTE),
  IMPACT_TYPE_NAME            VARCHAR2(30 BYTE),
  PRODUCT_ID                  VARCHAR2(30 BYTE),
  PRODUCT_FAMILY_ID           VARCHAR2(30 BYTE),
  INTERNAL_BE                 VARCHAR2(100 BYTE),
  INTERNAL_BSE                VARCHAR2(100 BYTE),
  EXTERNAL_BE                 VARCHAR2(100 BYTE),
  EXTERNAL_BSE                VARCHAR2(100 BYTE),
  FIN_SALES_THEATER_NAME      VARCHAR2(50 BYTE),
  AS_OF_FISCAL_QTR_NUM_INT    NUMBER,
  CURRENT_FISCAL_QTR_NUM_INT  NUMBER,
  COGS_REV_CURRENT_QTR_AMT    NUMBER,
  COGS_REV_PREV_QTR_AMT       NUMBER,
  COGS_REV_PREV_YEAR_AMT      NUMBER,
  COGS_REV_QOQ_IMPACT_AMT     NUMBER,
  COGS_REV_YOY_IMPACT_AMT     NUMBER,
  SERVICE_FLG                 CHAR(1 BYTE),
  GM_SM_CD                    VARCHAR2(10 BYTE),
  UPLOAD_USER                 VARCHAR2(20 BYTE),
  PURPOSE_OF_PLUG             VARCHAR2(50 BYTE)
)

CREATE OR REPLACE TYPE FIN_GM_WALK_MAN_ADJ_LIST AS TABLE OF  FIN_GM_WALK_MAN_ADJ_TYPE;

PROCEDURE FIN_GM_WALK_FILE_UPLOAD (
      I_GM_WALK_MAN_ADJ_LIST IN FIN_GM_WALK_MAN_ADJ_LIST)
   IS
      V_ERRMSG   VARCHAR2 (500);
   BEGIN
      DELETE FROM FIN_GM_WALK_MANUAL_ADJ_TEMP;

      COMMIT;

      FORALL i IN 1 .. I_GM_WALK_MAN_ADJ_LIST.COUNT
         INSERT INTO FIN_GM_WALK_MANUAL_ADJ_TEMP
              VALUES (I_GM_WALK_MAN_ADJ_LIST (i).ROW_NUM,
                      I_GM_WALK_MAN_ADJ_LIST (i).IMPACT_TYPE_CD,
                      I_GM_WALK_MAN_ADJ_LIST (i).IMPACT_TYPE_NAME,
                      I_GM_WALK_MAN_ADJ_LIST (i).PRODUCT_ID,
                      I_GM_WALK_MAN_ADJ_LIST (i).PRODUCT_FAMILY_ID,
                      I_GM_WALK_MAN_ADJ_LIST (i).INTERNAL_BE,
                      I_GM_WALK_MAN_ADJ_LIST (i).INTERNAL_BSE,
                      I_GM_WALK_MAN_ADJ_LIST (i).EXTERNAL_BE,
                      I_GM_WALK_MAN_ADJ_LIST (i).EXTERNAL_BSE,
                      I_GM_WALK_MAN_ADJ_LIST (i).FIN_SALES_THEATER_NAME,
                      I_GM_WALK_MAN_ADJ_LIST (i).AS_OF_FISCAL_QTR_NUM_INT,
                      I_GM_WALK_MAN_ADJ_LIST (i).CURRENT_FISCAL_QTR_NUM_INT,
                      I_GM_WALK_MAN_ADJ_LIST (i).COGS_REV_CURRENT_QTR_AMT,
                      I_GM_WALK_MAN_ADJ_LIST (i).COGS_REV_PREV_QTR_AMT,
                      I_GM_WALK_MAN_ADJ_LIST (i).COGS_REV_PREV_YEAR_AMT,
                      I_GM_WALK_MAN_ADJ_LIST (i).COGS_REV_QOQ_IMPACT_AMT,
                      I_GM_WALK_MAN_ADJ_LIST (i).COGS_REV_YOY_IMPACT_AMT,
                      I_GM_WALK_MAN_ADJ_LIST (i).SERVICE_FLG,
                      I_GM_WALK_MAN_ADJ_LIST (i).GM_SM_CD,
                      I_GM_WALK_MAN_ADJ_LIST (i).UPLOAD_USER,
                      I_GM_WALK_MAN_ADJ_LIST (i).PURPOSE_OF_PLUG);

      COMMIT;
   END FIN_GM_WALK_FILE_UPLOAD;

我的 Java 代码是

Query q = session.createSQLQuery(" { call FIN_GM_WALK_FILE_UPLOAD(:recList) }");
q.setParameter("recList",recordList);

其中 recordList 是已定义对象的 ArrayList

它抛出以下异常。

Caused by: java.sql.SQLException: ORA-06550: line 1, column 7: PLS-00306: wrong number or types of arguments in call to 'FIN_GM_WALK_FILE_UPLOAD'

有人可以帮我解决这个问题吗?

最佳答案

你需要这样做

q.setParameterList("recList",recordList);

关于java - 如何使用hibernate native sql查询将对象列表传递给oracle中的存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30868664/

相关文章:

mysql - 在 Hibernate 5 中未使用 hbm2ddl.auto=update 创建表

java - 需要简单的方法来修改 JTable 使用的 toString()

java - 是否可以使用 "sealed methods"改进密封类?

regex - PL/SQL 优化在 varchar 中搜索日期

database - 如何在 IF 语句中替换 SELECT 语句以使其工作

java - 在Hibernate中生成非冲突非主键唯一 "composite ids"

Java - 帮助将字母转换为整数,加5,然后转换回字母

java - 如何在 Kotlin/Java 中对 Numpy 数组(Python)进行 base64 解码?

python - 如何使用 cx_oracle django 包连接到 oracle 遗留数据库?

java - Spring 启动 : Hibernate and Flyway boot order