简体   繁体   English

如何使用休眠本机SQL查询将对象列表传递给oracle中的存储过程

[英]How to pass a list of objects to a stored procedure in oracle using hibernate native sql query

I am using hibernate to connect to an Oracle database. 我正在使用hibernate连接到Oracle数据库。

I need to call a stored procedure which takes an object type as input parameter. 我需要调用一个将对象类型作为输入参数的存储过程。

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;

and my Java code is 而我的Java代码是

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

where recordList is an ArrayList of the defined objects. 其中recordList是已定义对象的ArrayList

It's throwing below exception. 它被抛出异常之下。

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' 引起原因:java.sql.SQLException:ORA-06550:第1行,第7列:PLS-00306:对“ FIN_GM_WALK_FILE_UPLOAD”的调用中参数的数量或类型错误

Can anybody plz help me fix this? 有人可以帮我解决这个问题吗?

你需要这样做

q.setParameterList("recList",recordList);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM