如何处理 pl/sql 中的 invalid_identifier 异常?

How to handle invalid_identifier exception in pl/sql?

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

select 来自 table1

的 col1、col2、col3

如果 col1 不存在,我想显示 "missing field",而不是让用户收到无效标识符错误。

我最好和最短的选择是什么?

尝试:

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

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

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

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}: "([^"]+)".*$', '');

      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 错误消息中提取的。请注意,此示例尚未针对多个违规名称的情况进行测试 - 但是,您应该有所了解。
  • 第二行输出产生原始错误消息,仅供说明之用。
  • 异常处理程序仅响应您的异常并重新引发要在周围块之一中处理的任何其他异常。