来自mybatis的SQL过程调用

Vaibhav Dixit

全部,我试图从Java用户Mybatis调用SQL过程,但是我收到“ java.sql.SQLException:在索引:: 1处缺少IN或OUT参数”。谷歌搜索并没有给我正确的答案。下面是我写的代码。我是第一次使用mybatis,有人可以指导我吗?

Mepper.xml:-

<select id="addHardwareList" statementType="CALLABLE" parameterType="java.util.HashMap">
          {
                 call P_HW_SW_CRUD.SAVE_HARDWARE_INVENTORY(
                 #{pDataIn,javaType=Object,jdbcType=ARRAY,jdbcTypeName=TAB_IDESK_HW_INFO,mode=IN,typeHandler=com.tristar.idesk.mybatis.mapper.HardwareInventoryHandler}
                 #{pMsgCodeOut,javaType=Long,jdbcType=DECIMAL,mode=OUT}
             )
         }  
  </select>

这是我设置我的MAP的地方-

public void addUpdateInventory(JsonNode jsonNode) {

        Map<String, ?> inventoryMap = getMapFromJSONAddUpdate(jsonNode);
        HashMap<String,Object> returnMap = new HashMap<String,Object>();
        Long pErrodCodeOut = null;
        String pErrorMsg = null;

        returnMap.put("pDataIn", (List<HardwareInventoryBean>) inventoryMap.get("beanHardwareList"));
        returnMap.put("pErrorCodeOut", pErrodCodeOut);
        //returnMap.put("pErrodMsgOut", pErrorMsg);
        hardwareInventoryMapper.addHardwareList(returnMap);
    }

我还实现了一个自定义类型处理程序,以将我的Java bean属性映射到oracleType对象。

public class HardwareInventoryHandler implements TypeHandler{

    public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
        try{
            //new RecLoaderService().getJSONObj("REC_ICAST_CLAIMANT_INFO", "TAB_ICAST_CLAIMANT_INFO", jsonObject, i, ps);
            System.out.println(parameter);
            List<HardwareInventoryBean> hwInventoryList = (List<HardwareInventoryBean>) parameter;
            System.out.println("Parameter Here --"+parameter);
            StructDescriptor structDescriptor = StructDescriptor.createDescriptor(InventoryConstants.HW_DB_REC_TYPE_NAME, ps.getConnection());
            STRUCT[] structs = null;
            structs = new STRUCT[hwInventoryList.size()];
            for (int index = 0; index < hwInventoryList.size(); index++) {
                HardwareInventoryBean hwInventoryBean = hwInventoryList.get(index);
                Object[] params = new Object[12];
                params[0] = hwInventoryBean.getHwId();
                params[1] = hwInventoryBean.getHwTypeId();
                params[2] = hwInventoryBean.getHwModelId();
                params[3] = hwInventoryBean.getAssetId();
                params[4] = hwInventoryBean.getDateReceived();
                params[5] = hwInventoryBean.getHwPrice();
                params[6] = hwInventoryBean.getHwStatus();
                params[7] = hwInventoryBean.getHwWarranty();
                params[8] = hwInventoryBean.getCreatedBy();
                params[9] = hwInventoryBean.getCreatedDate();
                params[10] = hwInventoryBean.getModifiedBy();
                params[11] = hwInventoryBean.getModifiedDate();

                System.out.println("---------> " +hwInventoryBean.getHwId());

                STRUCT struct = new STRUCT(structDescriptor, ps.getConnection(), params);
                structs[index] = struct;

            }

            ArrayDescriptor desc = ArrayDescriptor.createDescriptor(InventoryConstants.HW_DB_TEB_TYPE_NAME, ps.getConnection());
            ARRAY oracleArray = new ARRAY(desc, ps.getConnection(), structs);
            ps.setArray(i, oracleArray);
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }

    public JSONObject getResult(ResultSet rs, String columnName)
            throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

    public JSONObject getResult(ResultSet rs, int columnIndex)
            throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

    public JSONObject getResult(CallableStatement cs, int columnIndex)
            throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

}

映射器接口----

public void addHardwareList(HashMap<String, Object> returnMap);

我的SQL Procedure代码是:-

create or replace PACKAGE BODY P_HW_SW_CRUD AS  -- body
PROCEDURE save_hardware_inventory (hw IN TAB_IDESK_HW_INFO, nu OUT NUMBER) IS
ERROR_CODE NUMBER(10);
ERROR_DESC VARCHAR2(200);
   BEGIN 
   nu := 10;
   FOR i IN 1 .. hw.COUNT
   loop
   if(hw(i).HW_ID <> 0) then
   INSERT INTO IDESK_HW_INVENTORY VALUES (IDESK_HW_INVENTORY_seq.nextval, hw(i).hwTypeId , hw(i).hwModelId,hw(i).assetId    
        , hw(i).dateReceived    , hw(i).hwPrice ,hw(i).hwStatus , hw(i).hwWarrenty  , hw(i).createdBy , sysdate,hw(i).modifiedBy, sysdate); 
 else 
 update IDESK_HW_INVENTORY set HW_TYPE_ID=hw(i).hwTypeId,HW_MODEL_ID=hw(i).hwModelId,ASSET_ID=hw(i).assetId,DATE_RECEIVED=hw(i).dateReceived,HW_PRICE=hw(i).hwPrice,HW_STATUS=hw(i).hwStatus,HW_WARRENTY=hw(i).hwWarrenty,MODIFIED_BY=hw(i).modifiedBy,MODIFIED_DATE=sysdate where HW_ID=hw(i).HW_ID;
 end If;
        end loop;
         Exception
   when others then
   ROLLBACK;
   ERROR_CODE := SQLCODE;
   ERROR_DESC := SQLERRM;

   END save_hardware_inventory ;
PROCEDURE save_software_inventory (sw IN TAB_IDESK_SW_INFO ) IS
ERROR_CODE NUMBER(10);
ERROR_DESC VARCHAR2(200);
   BEGIN   
   FOR i IN 1 .. sw.COUNT
   loop
   if(sw(i).SW_ID <> 0) then
   INSERT INTO IDESK_SW_INVENTORY VALUES (IDESK_SW_INVENTORY_seq.nextval, sw(i).SW_VENDOR_ID , sw(i).SW_VERSION_TITLE,sw(i).QUANTITY    
         , sw(i).PRICE  , sw(i).CONTRACT_ACOUNT_NUM ,sw(i).SW_STATUS    , sw(i).CREATED_BY  ,sysdate, sw(i).MODIFIED_BY , sysdate); 
  else 
 update IDESK_SW_INVENTORY set SW_VENDOR_ID=sw(i).SW_VENDOR_ID,SW_VERSION_TITLE=sw(i).SW_VERSION_TITLE,QUANTITY=sw(i).QUANTITY,PRICE=sw(i).PRICE,CONTRACT_ACOUNT_NUM=sw(i).CONTRACT_ACOUNT_NUM,SW_STATUS=sw(i).SW_STATUS,MODIFIED_BY=sw(i).MODIFIED_BY,MODIFIED_DATE=sysdate where SW_ID=sw(i).SW_ID;
 end If;
         end loop;
  Exception
   when others then
   ROLLBACK;
   ERROR_CODE := SQLCODE;
   ERROR_DESC := SQLERRM;

   END save_software_inventory ;
END P_HW_SW_CRUD ;
Vaibhav Dixit

我使用最里面的委托连接解决了这个问题

 ((DelegatingConnection)ps.getConnection()).getInnermostDelegate().

下一个错误是由于mapper.xml(“,”在mapper.xml的选择ID中缺少拼写错误)。请参见下面的正确语法。

select id="addHardwareList" 
statementType="CALLABLE" parameterType="java.util.HashMap">
      {
             call P_HW_SW_CRUD.SAVE_HARDWARE_INVENTORY(
             #{pDataIn,javaType=Object,
jdbcType=ARRAY,jdbcTypeName=TAB_IDESK_HW_INFO,
 mode=IN,typeHandler=com.tristar.idesk.mybatis.mapper.HardwareInventoryHandler}
             #{pMsgCodeOut,javaType=Long,jdbcType=DECIMAL,mode=OUT}
         )
     }  

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

来自mybatis的SQL过程调用

来自分类Dev

来自Lightswitch的存储过程调用

来自分类Dev

来自Lightswitch的存储过程调用

来自分类Dev

调用过程LIKE%SQL

来自分类Dev

MyBatis批注可调用存储过程并获取参数

来自分类Dev

在mybatis中调用存储过程时出现错误

来自分类Dev

从ant脚本调用PL / SQL过程不会运行存储过程

来自分类Dev

调用存储过程还是运行sql查询?

来自分类Dev

Oracle SQL存储过程调用与执行

来自分类Dev

从SQL Server存储过程调用API

来自分类Dev

Delphi调用SQL Server存储过程慢

来自分类Dev

从Django调用Postgres SQL存储过程

来自分类Dev

使用Dapper调用SQL存储过程

来自分类Dev

SQL Server:创建和调用存储过程

来自分类Dev

C#SQL存储过程调用值

来自分类Dev

从ODI调用Oracle PL / SQL存储过程

来自分类Dev

SQL命令调用递归存储过程

来自分类Dev

从SQL Server存储过程调用API

来自分类Dev

从PL / SQL Job调用存储过程

来自分类Dev

SQL Server:创建和调用存储过程

来自分类Dev

调用存储过程还是运行sql查询?

来自分类Dev

使用 callproc 从 django 调用 PL/SQL 过程

来自分类Dev

SQL存储过程-来自三个表的列?

来自分类Dev

来自 SQL Server 存储过程的动态网格视图列

来自分类Dev

如何使用mybatis从带有postgresql的过程调用中返回表或setof?

来自分类Dev

如何使用来自 ASP.NET 的多个输入值调用 MySQL 存储过程

来自分类Dev

用SQL中的过程执行替换函数调用

来自分类Dev

使用AJAX调用Worklight SQL适配器过程

来自分类Dev

调用Oracle PL / SQL过程时使用哪种编码