【发布时间】: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