执行触发期间出现“数字或值错误”

时间:2014-03-19 16:56:20

标签: plsql triggers oracle-apex

我目前正在使用Oracle Apex开发一个应用程序,该应用程序被用作数据库来保存布线记录。

当删除数据库中的组件时,将执行PL / SQL触发器,删除与另一个表(PORT)中组件的任何关联,并将端口引用设置为0.

对于我尝试删除的大多数组件,触发器似乎都能正常工作,但会向我显示“数字或值”错误'对于其他人而言,我正在努力找出原因(如下所示)

error

正在执行的触发器如下所示:

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

但是我无法弄清楚为什么它在某些情况下可以正常工作而在其他情况下却不能正常工作!

1 个答案:

答案 0 :(得分:2)

替换

FOR i IN port_arr.FIRST .. port_arr.LAST

使用:

FOR i IN 1 .. port_arr.COUNT

如果没有删除任何记录,则不会初始化该数组,port_arr.FIRSTport_arr.LAST将返回null,这将引发异常ORA-06502: PL/SQL: numeric or value errorCOUNT始终可以安全使用,即使在尚未初始化的集合上也是如此。