【问题标题】:Condition in SQL scriptSQL 脚本中的条件
【发布时间】:2011-01-30 20:08:56
【问题描述】:

我有一个由 SQL*Plus 执行的 SQL 脚本,它需要与 Oracle 10gOracle 11g 一起运行。

该脚本为 11g 之前不存在的包提供授权:

GRANT EXECUTE ON sys.dbms_result_cache TO my_user;

我想避免 10g 上的异常,因为我想对脚本中的其他异常做出反应。


一种方法是使用Conditional Compilationdbms_db_version

BEGIN
  $IF dbms_db_version.ver_le_10 $THEN NULL; $ELSE
    EXECUTE IMMEDIATE 'GRANT EXECUTE ON sys.dbms_result_cache TO my_user';
  $END
END;
/

有没有其他方法,最好不使用PL/SQL?

【问题讨论】:

    标签: sql oracle plsql sqlplus


    【解决方案1】:

    您的问题和其中一个 cmets 表明您希望避免 PL/SQL 块并立即执行。我还假设“对其他异常做出反应”是指在遇到异常时中止脚本的执行。

    如果是这样,我认为在纯 SQL/SQL*Plus 中你能做的最好的事情就是忽略授予语句的异常退出:

    ... first part of script (with exit on sqlerror in effect)
    WHENEVER SQLERROR CONTINUE
    GRANT EXECUTE ON sys.dbms_result_cache TO my_user;
    WHENEVER SQLERROR EXIT SQL.SQLCODE
    ... remaining part of script
    

    【讨论】:

    • 谢谢!这也行。因为它永远不会失败(即使我编写了无效代码)我想我会坚持我的解决方案。
    【解决方案2】:

    你可以事先检查对象是否存在:

    BEGIN
       FOR cc IN (SELECT NULL
                    FROM all_objects
                   WHERE owner = 'SYS'
                     AND object_name = 'DBMS_RESULT_CACHE'
                     AND ROWNUM = 1) LOOP
          EXECUTE IMMEDIATE 'GRANT EXECUTE ON sys.dbms_result_cache TO my_user';
       END LOOP;
    END;
    

    【讨论】:

    • @Vincent Malgrat:是的,但它仍然会涉及 PL/SQL 和 EXECUTE IMMEDIATE...
    • @Peter:是的,我认为你不能只使用 SQL*Plus 来模拟分支算法。
    【解决方案3】:

    您可以通过编写生成 SQL 并将其假脱机到 sql 脚本的 SQL 来模拟分支。然后运行sql脚本:

    define temp_file='somefile.sql'
    
    set heading off
    set feedback off
    spool &&temp_file
    
    SELECT 'GRANT EXECUTE ON sys.dbms_result_cache TO my_user;'
      FROM all_objects
     WHERE owner = 'SYS'
       AND object_name = 'DBMS_RESULT_CACHE';
    
    spool off
    @&&temp_file
    host rm &&temp_file
    

    感谢@Vincent 提供数据字典查询。

    【讨论】:

      猜你喜欢
      • 2016-04-12
      • 1970-01-01
      • 2019-02-25
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 2017-08-03
      • 1970-01-01
      • 2019-02-17
      相关资源
      最近更新 更多