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

use*_*682 1 oracle plsql exception dynamic-sql

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

从table1中选择col1,col2,col3

如果col1不存在,我想显示"缺少字段",而不是让用户获得无效的标识符错误.

这是我最好和最短的选择吗?

col*_*sar 5

这个代码片段应该让你开始:

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
Run Code Online (Sandbox Code Playgroud)

说明:

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