Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL函数中迭代数组_Sql_Plsql - Fatal编程技术网

在SQL函数中迭代数组

在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,

我的SQL函数有问题,我传入了4个NUM_数组类型的参数。我的函数在每个FOR循环中的WHERE子句处挂起。因此,我不确定如何将我的表格ComColumn“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;
创建或替换函数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,并将大量的数组绑定到数据库,而不是现在的缓慢处理