2014-03-19 25 views
3

我目前正在使用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 

但我不明白爲什麼它在某些情況下,罰款在別人!

回答

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始終可以安全使用,即使是尚未初始化的集合。

+0

謝謝,完美的作品! 還在繼續處理PL/SQL,所以感謝您的幫助和明確的解釋。 –