我在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_is是一种自定义类型。我已将其创建为
`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'`.
这里有什么不对的?我想这是存储过程。但我对编写存储过程并不多。或者是否可以传递逗号分隔列表并将其拆分为存储过程?
答案 0 :(得分:0)
解决了这个问题。我删除了创建的自定义类型“分发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用于我想要的任何操作。