SQL脚本中的条件
我有一个SQL*Plus执行的SQL脚本,需要与Oracle 10g和Oracle 11g一起运行 该脚本为11g之前不存在的包提供授权:SQL脚本中的条件,sql,oracle,plsql,sqlplus,Sql,Oracle,Plsql,Sqlplus,我有一个SQL*Plus执行的SQL脚本,需要与Oracle 10g和Oracle 11g一起运行 该脚本为11g之前不存在的包提供授权: GRANT EXECUTE ON sys.dbms_result_cache TO my_user; 我希望避免10g上的异常,因为我希望对脚本中的其他异常做出反应 一种方法是使用和: 有没有其他方法,最好不使用PL/SQL?您可以事先检查对象是否存在: BEGIN FOR cc IN (SELECT NULL FR
GRANT EXECUTE ON sys.dbms_result_cache TO my_user;
我希望避免10g上的异常,因为我希望对脚本中的其他异常做出反应
一种方法是使用和:
有没有其他方法,最好不使用PL/SQL?您可以事先检查对象是否存在:
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;
您的问题和一条注释表明您希望避免PL/SQL块并立即执行。我还假设“对其他异常作出反应”是指在遇到异常时中止脚本的执行 如果是这样,我认为在纯SQL/SQL*Plus中最好的方法就是忽略grant语句的异常出口:
... 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
您可以通过编写生成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提供的数据字典查询。@Vincent Malgrat:是的,但它仍然会涉及PL/SQL和
立即执行
。@Peter:是的,我认为您不能仅使用SQL*Plus模拟分支算法。谢谢!这也行。因为它永远不会失败(即使我写的代码无效),所以我想我会坚持我的解决方案。
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