【问题标题】:How to handle invalid_identifier exception in pl/sql?如何处理 pl/sql 中的 invalid_identifier 异常?
【发布时间】:2015-04-04 04:15:59
【问题描述】:

我需要检查某个SELECT语句是否包含表中不存在的字段(列),例如:

从 table1 中选择 col1、col2、col3

如果 col1 不存在,我想显示“缺失字段”,而不是让用户得到一个无效的标识符错误。

我最好的选择是什么?

【问题讨论】:

    标签: oracle exception plsql dynamic-sql


    【解决方案1】:

    此代码片段应该可以帮助您入门:

    set serveroutput on
    DECLARE
       exc_invalid_id EXCEPTION;
       PRAGMA EXCEPTION_INIT(exc_invalid_id, -904);
       l_message   VARCHAR2(4000);
    BEGIN
       EXECUTE IMMEDIATE '
          SELECT col1
               , col2
               , col3
            FROM table1
       ';
    EXCEPTION
       WHEN exc_invalid_id THEN
          l_message := regexp_replace(sqlerrm, '^[A-Z]{3}-[0-9]{5}: "([^"]+)".*$', '\1');
    
          dbms_output.put_line ( 'missing field '''||l_message||'''');
          dbms_output.put_line ( 'exception: sqlcode='||SQLCODE||', sqlerrm='''||sqlerrm||'''');
    
       WHEN OTHERS THEN
          RAISE;
    END;
    /
    show errors
    

    解释:

    • 您声明了一个用户定义的异常。
    • 您将异常与在未知列标识符上引发的 Oracle 错误相关联,其代码为 00904
    • sql 查询作为本地动态 sql 执行 - 否则代码一开始就无法编译。
    • 错误消息由您选择的文本和有问题的列名组成。该名称是通过正则表达式从 oracle 错误消息中提取的。请注意,此示例尚未针对多个违规名称的情况进行测试 - 但是,您应该明白这一点。
    • 输出的第二行生成原始错误消息,仅用于说明目的。
    • 异常处理程序仅响应您的异常并重新引发任何其他异常以在周围块之一中处理。

    【讨论】:

      【解决方案2】:

      试试:

       select 1
       from   user_tab_columns
       where  table_name = '<your table name>'  and
              column_name = '<your column name>'
      

      这仅适用于同一架构中的表。如果您需要其他模式,请替换为 ALL_TAB_COLUMNS 视图。如果没有返回行,则不存在列。我假设这是针对动态 SQL 的,因为对于静态 SQL,如果该列仍然丢失,则会出现编译错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多