我目前正在使用Oracle Apex开发一个应用程序,该应用程序被用作数据库来保存布线记录。
当删除数据库中的组件时,将执行PL / SQL触发器,删除与另一个表(PORT)中组件的任何关联,并将端口引用设置为0.
对于我尝试删除的大多数组件,触发器似乎都能正常工作,但会向我显示“数字或值”错误'对于其他人而言,我正在努力找出原因(如下所示)
正在执行的触发器如下所示:
create or replace trigger "COMPONENT_TRIGPORT"
AFTER delete
on "COMPONENT"
for each row
declare
TYPE portType IS TABLE OF PORT%ROWTYPE;
port_arr portType;
begin
DELETE FROM PORT
where PORT.COMPONENT_ID = :old.COMPONENT_ID
RETURNING PORT_ID, PORT_NUMBER, COMPONENT_ID, CONNECTOR_ID, PORT_TYPE
BULK COLLECT INTO port_arr;
begin
FOR i IN port_arr.FIRST .. port_arr.LAST
LOOP
update PORT
set PORT.CONNECTOR_ID = 0
where PORT.CONNECTOR_ID = port_arr(i).CONNECTOR_ID;
END LOOP;
end;
end;
我知道给我错误的行是
where PORT.COMPONENT_ID = :old.COMPONENT_ID
但是我无法弄清楚为什么它在某些情况下可以正常工作而在其他情况下却不能正常工作!
答案 0 :(得分:2)
替换
FOR i IN port_arr.FIRST .. port_arr.LAST
使用:
FOR i IN 1 .. port_arr.COUNT
如果没有删除任何记录,则不会初始化该数组,port_arr.FIRST
和port_arr.LAST
将返回null,这将引发异常ORA-06502: PL/SQL: numeric or value error
。 COUNT
始终可以安全使用,即使在尚未初始化的集合上也是如此。