Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL脚本中的条件_Sql_Oracle_Plsql_Sqlplus - Fatal编程技术网

SQL脚本中的条件

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

我有一个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
                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