迭代SQL函数中的数组

时间:2011-05-12 14:25:32

标签: sql plsql

我的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;

2 个答案:

答案 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被执行,并且数组被批量绑定到数据库 - 而不是你现在所获得的慢速处理。