某些类型的用户执行脚本时如何忽略 Oracle pl/sql 中的编译错误

How to ignore compilation error in Oracle pl/sql when script is executed by certain types of user

我想要一个简单的方法,当我的团队成员登录到 SQLPlus 时,自动确认模式属于哪个客户,以避免错误。

我按如下方式配置了 glogin.sql,当以架构所有者身份登录时效果很好:

set echo off
set serveroutput on
set linesize 200

Declare
   sysDesc varchar2(255);
BEGIN

  if USER like '%SCHEMAOWNER%' then
    select DESCRIPTION into sysDesc from SCHEMA_INFO;
  else
    sysDesc := '(DBA User)';
  end if; 

  dbms_output.put_line('*******************************************************************');
  dbms_output.put_line('WARNING - THIS IS A CUSTOMER SYSTEM!!!');
  dbms_output.put_line('*******************************************************************' || chr(13) || chr(10));
  dbms_output.put_line('- Description:   ' || SysDesc);
  dbms_output.put_line('- User:  ' || USER);
  dbms_output.put_line('- Database:      ' || sys_context('USERENV','DB_NAME') || chr(13) || chr(10));
  dbms_output.put_line('*******************************************************************');

END;
/

但是,有时我们需要以DBA 用户身份登录。 DBA 用户看不到 SCHEMA_INFO table,因此用户收到此错误:

ERROR at line 9:
ORA-06550: line 9, column 43:
PL/SQL: ORA-00942: table or view does not exist
ORA-06550: line 9, column 5:
PL/SQL: SQL Statement ignored

我尝试添加一个异常处理程序,但后来意识到这是一个编译错误,所以这没有用。我也尝试使用立即执行,但找不到使用 select 语句输出的方法。

有谁知道如何根据用户类型忽略编译错误或运行不同的script/block?

为不存在的 table 异常创建自定义异常,然后在发生时捕获它:

set echo off
set serveroutput on
set linesize 200

Declare
   sysDesc varchar2(255);
BEGIN

  if USER like '%SCHEMAOWNER%' then
    DECLARE
      table_or_view_does_not_exist EXCEPTION;
      PRAGMA EXCEPTION_INIT( table_or_view_does_not_exist, -942 );
    BEGIN
      EXECUTE IMMEDIATE 'select DESCRIPTION from SCHEMA_INFO' into sysDesc;
    EXCEPTION
      WHEN table_or_view_does_not_exist THEN
        -- You should validate that the user is a DBA here.
        sysDesc := '(DBA User)';
    END;
  else
    sysDesc := '(DBA User)';
  end if; 

  dbms_output.put_line('*******************************************************************');
  dbms_output.put_line('WARNING - THIS IS A CUSTOMER SYSTEM!!!');
  dbms_output.put_line('*******************************************************************' || chr(13) || chr(10));
  dbms_output.put_line('- Description:   ' || SysDesc);
  dbms_output.put_line('- User:  ' || USER);
  dbms_output.put_line('- Database:      ' || sys_context('USERENV','DB_NAME') || chr(13) || chr(10));
  dbms_output.put_line('*******************************************************************');

END;
/