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

标签 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

但我不明白为什么它在某些情况下工作正常但在其他情况下却不行!

最佳答案

替换

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:数字或值错误COUNT 始终可以安全使用,即使在尚未初始化的集合上也是如此。

关于plsql - 执行触发器期间出现“数字或值错误”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22512908/

相关文章:

java - 使用 Oracle JVM 将 blob 作为参数传递给 java 方法

java - 业务逻辑 : moving from stored procedures to BRMS. 优缺点

MySQL触发器+多数据库复制

mysql - 同一张表上触发插入

SQL - 如何统计某一年的数据数量?

ORACLE APEX - 下载到 .CSV(空值显示为 - 丢失)问题

oracle - 如何做一个函数来从 pl/sql 中的表中返回行类型?

oracle - 如何同时运行两个或多个 Oracle 作业实例?

testing - 从 TestRail 触发 Jenkins 构建

forms - APEX-创建具有链接到多个相关表的多种表单的页面...全部通过一个按钮提交吗?