在SQL函数中迭代数组
我的SQL函数有问题,我传入了4个NUM_数组类型的参数。我的函数在每个FOR循环中的WHERE子句处挂起。因此,我不确定如何将我的表格ComColumn“edit_id”与我的特定参数进行比较在SQL函数中迭代数组,sql,plsql,Sql,Plsql,我的SQL函数有问题,我传入了4个NUM_数组类型的参数。我的函数在每个FOR循环中的WHERE子句处挂起。因此,我不确定如何将我的表格ComColumn“edit_id”与我的特定参数进行比较 CREATE OR REPLACE FUNCTION DEL_BS_INFO (pLfEditDel IN NUM_ARRAY, pRcEditDel IN NUM_ARRAY,
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;
创建或替换函数DEL_BS_INFO(NUM_数组中的pLfEditDel,
NUM_数组中的pRcEditDel,
NUM_数组中的pSpnEditDel,
pComEditDel(在NUM_数组中)
返回号码
是
tmpVar数;
--
开始
--如果在丢失/找回表上选中了删除。
如果0
更改此选项:
WHERE EDIT_ID = pLfEditDel
为此:
WHERE EDIT_ID = pLfEditDel(i)
更改此项:
WHERE EDIT_ID = pLfEditDel
为此:
WHERE EDIT_ID = pLfEditDel(i)
出于性能原因,我建议您将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,并将大量数组绑定到数据库,而不是当前的缓慢处理。出于性能原因,我建议您将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,并将大量的数组绑定到数据库,而不是现在的缓慢处理