交互式网格 - 交互式网格的数据库约束错误处理

Posted

技术标签:

【中文标题】交互式网格 - 交互式网格的数据库约束错误处理【英文标题】:Interactive Grid - database constraint error handling for interactive grid 【发布时间】:2020-05-18 16:30:55 【问题描述】:

我正在使用 APEX 19.2。我正在尝试使用错误处理函数来处理约束错误。

我在具有唯一约束的表上构建了一个交互式网格。我创建了constraint_lookup,将约束名称与消息匹配。

我创建了一个主要基于Oracle Doc示例的函数(例如在包wwv_flow_error_api中)

我唯一改变的是显示位置:

l_result.display_location := case
                                 when l_result.display_location =
                                      apex_error.c_on_error_page then
                                  apex_error.c_inline_with_field_and_notif
                                 else
                                  l_result.display_location
                               end;

现在,当我尝试添加具有非唯一值的值时,我在通知中收到一条我想要的消息,但我不知道如何处理它以在通知和字段中显示错误(例如在顶点验证中,您可以在其中关联项目)

我尝试列出所有 apex_error 属性,但我得到了

p_error 消息 ORA-00001:naruszono więzy unikatowe (#CONSTAINT_NAME#) 附加信息 ORA-00001:naruszono więzy unikatowe (#CONSTAINT_NAME#) 显示位置 ON_ERROR_PAGE 关联类型 页面项目名称 region_id 列别名 行数 model_instance_id model_record_id apex_error_code 原始消息 original_additional_info ora_sqlcode -1 ora_sqlerrm ORA-00001: naruszono więzy unikatowe (#CONSTAINT_NAME#) 错误回溯 error_statement "ADM"

l_result 消息#错误消息# Additional_info ORA-00001:naruszono wiezy unikatowe (#CONSTAINT_NAME#) display_location INLINE_WITH_FIELD_AND_NOTIFICATION 页面项目名称 列别名

如何将约束中的字段与交互式网格中的字段连接起来?

【问题讨论】:

【参考方案1】:

您应该添加 p_page_item_name 参数。例如:

    p_message  => 'Employee name cannot be null',
    p_display_location => apex_error.c_inline_with_field_and_notif ,
    p_page_item_name => 'P10_NAME');

【讨论】:

它不是交互式网格中的项目【参考方案2】:

您能否使用以下代码更新您的错误处理功能。它添加了额外的调试语句。

if p_error.ora_sqlcode in (-1, -2091, -2290, -2291, -2292) then
    l_constraint_name := apex_error.extract_constraint_name (
                             p_error => p_error );
    apex_debug.info( 'Raised constraint error: %s', l_constraint_name );

    begin
        select message
          into l_result.message
          from constraint_lookup
         where constraint_name = l_constraint_name;
        apex_debug.info( 'Constraint found, new message: %s', l_result.message );
    exception when no_data_found then
        apex_debug.info( 'Constraint not found in constraint_lookup' );
    end;
end if;

在调试模式下运行您的应用程序并重现错误。之后,您可以使用 View Debug 来确定您的 constraint_lookup 条目是否实际被使用。

【讨论】:

但我知道我使用了哪一个 constraint_lookup 条目。我在 DB 中有 uq 约束,我使用错误处理函数处理错误消息,但我需要将其与交互式网格中的字段相关联,如顶点验证中

以上是关于交互式网格 - 交互式网格的数据库约束错误处理的主要内容,如果未能解决你的问题,请参考以下文章

在将编辑内容保存到数据库之前验证 Oracle Apex 可编辑交互式网格

Oracle APEX 交互式网格:如何使用 PLSQL 访问内容?

交互式网格:仅使用不基于表的 PL/SQL 处理

Oracle APEX交互式网格新行不可编辑

JavaScript的交互式表格和数据网格

单击保存按钮后或以固定时间间隔如何自动刷新交互式网格?