【问题标题】:Getting wrong number or types of arguments in call to exception while executing stored procedure在执行存储过程时调用异常时获取错误数量或类型的参数
【发布时间】:2013-12-16 10:41:48
【问题描述】:

我在oracle中创建了下面的存储过程。

CREATE OR REPLACE PROCEDURE "UPDATE_ASSET_LOB_PROC"(
asset_id IN integer,
distribution_id_list IN distribution_id)

IS
CURSOR dist_id
IS
select adt.lkp_dist_type from Asset_Dist_Type adt where adt.asset_id= asset_id;

BEGIN

  delete  from Asset_Dist_Type where asset_id= asset_id;
  commit;
  for i IN dist_id 
  LOOP
  insert into Asset_Dist_Type values (asset_id_list,i.lkp_dist_type);
  commit;
  END LOOP;

END UPDATE_ASSET_LOB_PROC;

distribution_是一种自定义类型。我已将其创建为

`CREATE TYPE distribution_id AS TABLE OF NUMBER;`

我的java代码如下。

Integer[] idArray = new Integer[selectedDistributionTypes.size()]; 
        idArray = selectedDistributionTypes.toArray(idArray); 

    entityManager.createNativeQuery("CALL UPDATE_ASSET_LOB_PROC (:assetIdParam,:distributionIdParam)")
                    .setParameter("assetIdParam", assetId).setParameter("distributionIdParam", idArray).executeUpdate();

我来了

`Caused by: java.sql.SQLException: ORA-06553: PLS-306: wrong number or types of arguments in call to 'UPDATE_ASSET_LOB_PROC'`.

这里有什么问题?我猜它与存储过程有关。但我不太喜欢编写存储过程。或者传递一个逗号分隔的列表并将其拆分为存储过程是否可行?

【问题讨论】:

  • 请告诉我们调用你的程序的java代码
  • @StefanBeike。我已经更新了相关代码。
  • 很可能.setParameter("distributionIdParam", idArray) 没有按照应有的方式设置您的类型。然后数据库正在接收它无法处理的东西。
  • @JorgeCampos.. 嗨。 idArray 是一个整数数组。它应该将值设置为distribution_id_list。它的类型为 TABLE OF NUMBER。我应该在这里改变什么吗?或者有没有其他方法可以将数组发送到存储过程?
  • 我在 StoredProcedures 上做了很多工作,但当我有不同的命名时会遇到问题。这也是这种情况:asset_id(SQL) = assetIdParam(Java) 并且对于 distribution_id_list = distributionIdParam 在 Java 和 SQL 中取相同的名称

标签: java sql oracle stored-procedures


【解决方案1】:

解决了这个问题。我删除了创建的自定义类型“distribution id”,并将 distribution_id_list 设为 varchar2。从 bean 中,我发送了一个逗号分隔的列表,并在存储过程中删除了逗号在其上的循环,如下所示。

SELECT REGEXP_SUBSTR (distribution_id_list, '[^,]+', 1,LEVEL) dist_id
                             FROM DUAL
                             CONNECT BY REGEXP_SUBSTR (distribution_id_list, '[^,]+', 1, LEVEL) IS NOT NULL

在 for 循环中,我可以使用 dist_id 进行任何我想要的操作。

【讨论】:

    猜你喜欢
    • 2021-12-11
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 2020-06-17
    • 2016-07-01
    • 2021-11-30
    • 2011-07-01
    相关资源
    最近更新 更多