我的SQL函数出现问题,我传递了4个类型为NUM_ARRAY的参数。我的函数挂在每个FOR循环的WHERE子句中。所以,我不确定如何将我的表格comlumn'edit_id'与我的特定参数进行比较。
CREATE OR REPLACE FUNCTION DEL_BS_INFO (pLfEditDel IN NUM_ARRAY,
pRcEditDel IN NUM_ARRAY,
pSpnEditDel IN NUM_ARRAY,
pComEditDel IN NUM_ARRAY)
RETURN NUMBER
IS
tmpVar NUMBER;
--
BEGIN
-- If a deletion is checked on the Lost/Found table.
IF 0 < plfEditDel.COUNT
THEN
FOR i IN plfEditDel.FIRST .. plfEditDel.LAST
LOOP
UPDATE BSSS
SET LOST_FOUND = NULL,
LOST_DESC = NULL,
LOST_LOC = NULL,
LOST_DATE = NULL
WHERE EDIT_ID = pLfEditDel;
END LOOP;
END IF;
-- If a deletion is checked on the Returned Check table.
IF 0 < pRcEditDel.COUNT
THEN
FOR i IN pRcEditDel.FIRST .. pRcEditDel.LAST
LOOP
UPDATE XT_BSSS
SET RETURN_CHECK = NULL,
RETURN_LOC = NULL,
RETURN_DATE = NULL
WHERE EDIT_ID = pRcEditDel;
END LOOP;
END IF;
-- If a deletion is checked on the Sponsor table.
IF 0 < pSpnEditDel.COUNT
THEN
FOR i IN pSpnEditDel.FIRST .. pSpnEditDel.LAST
LOOP
UPDATE XT_BSSS
SET SPONSOR = NULL,
SPON_LOC = NULL,
SPON_START = NULL,
SPON_END = NULL
WHERE EDIT_ID = pSpnEditDel;
END LOOP;
END IF;
-- If a deletion is checked on the Comments table.
IF 0 < pComEditDel.COUNT
THEN
FOR i IN pComEditDel.FIRST .. pComEditDel.LAST
LOOP
UPDATE XT_BSSS
SET COMMENT = NULL
WHERE EDIT_ID = pComEditDel;
END LOOP;
END IF;
COMMIT;
RETURN 0;
EXCEPTION
WHEN OTHERS
THEN
ROLLBACK;
RETURN SQLCODE;
END XFW_DEL_BS_INFO;
答案 0 :(得分:3)
改变这个:
WHERE EDIT_ID = pLfEditDel
到此:
WHERE EDIT_ID = pLfEditDel(i)
答案 1 :(得分:1)
出于性能原因,我建议您将FOR循环更改为FORALL语句,例如:
FORALL i IN plfEditDel.FIRST .. plfEditDel.LAST
UPDATE BSSS
SET LOST_FOUND = NULL,
LOST_DESC = NULL,
LOST_LOC = NULL,
LOST_DATE = NULL
WHERE EDIT_ID = pLfEditDel(i);
这将导致一个SQL被执行,并且数组被批量绑定到数据库 - 而不是你现在所获得的慢速处理。