【问题标题】:Script Error in Oracle SQLOracle SQL 中的脚本错误
【发布时间】:2016-09-26 11:22:14
【问题描述】:

我有一个包含以下语句的 sql 文件:

BEGIN
if (&&masterKey = 1) then
shutdown immediate;
startup restrict;
end if;
END;
/

在另一个 SQL 文件 (defineVariables.sql) 中,我声明了变量 masterKey。

DEFINE masterKey = 0;

并在此处使用

导入该sql
@defineVariables.sql

执行脚本时出现以下错误。我不确定是不是因为我使用了关闭语句?有人可以帮我解决这个问题吗?

错误信息:

SQL> BEGIN
  2  if (&&masterKey = 1) then
  3  shutdown immediate;
  4  startup restrict;
  5  end if;
  6  END;
  7  /
old   2: if (&&masterKey = 1) then
new   2: if (0 = 1) then
shutdown immediate;
         *
ERROR at line 3:
ORA-06550: line 3, column 10:
PLS-00103: Encountered the symbol "IMMEDIATE" when expecting one of the
following:
:= . ( @ % ;
ORA-06550: line 5, column 1:
PLS-00103: Encountered the symbol "END" when expecting one of the following:
begin function pragma procedure subtype type <an identifier>
<a double-quoted delimited-identifier> current cursor delete
exists prior

【问题讨论】:

  • 立即关闭不是 plsql 命令。这是一个 sqlplus 命令。
  • 我认为你不能在同一个 plsql 块中同时使用关闭和启动。从您的代码中,一旦执行将立即关闭,整个数据库将关闭。之后的语句将不会执行。
  • @XING 在没有 BEGIN 和 END 块且没有 if 条件的情况下运行脚本没有任何问题。所以也许问题是 Rene 指出的语法不正确。但是有没有什么方法可以根据一个标志来选择执行这些语句?
  • 我猜 Rene 用 flag 给了你答案。看看他的解决方案。同样如前所述,当您单独执行时,它被视为 sqplus 命令语句并且会执行但在块中它失败了
  • PL/SQL 完全在数据库内部执行,因此它无法自行关闭然后自行启动。这就是 PL/SQL 没有shutdown 命令的原因之一。

标签: sql oracle plsql syntax-error sqlplus


【解决方案1】:

您不能在 PLSQL 中执行此操作,因为“立即关闭”不是 PLSQL 或 SQL 命令,而是 SQLplus 命令。此问题的答案中描述了实现脚本有条件执行的一种方法: SQLplus decode to execute scripts

基本上,根据主密钥的值,您可以选择两个脚本名称之一,然后使用该名称执行脚本。

基于上一个示例中的代码。

  sql>  variable flag varchar2(7);
  sql>  exec :flag := '&&masterKey';
  sql>  column our_script new_value script noprint;
  sql>  select decode(:flag, '1', 
                   'c:\sqlplus\shutdown_script.sql', 
                   'c:\sqlplus\do_not_shutdown.sql'
                   ) our_script
    from dual;

执行

sql> @&script;

shutdown_script 是

prompt shutting down
shutdown immediate;

do_not_shutdown 脚本将是

prompt Not shutting down

【讨论】:

  • 感谢您的回答,但我不清楚。如何选择脚本名称?我也不理解解码示例。
  • 就我个人而言,我从未编写过数据库关闭脚本。所以我不确定你是否解决了正确的问题。
  • 它用于归档过程中的回滚脚本,我们尝试删除为该过程创建的一些用户。大多数情况下,我们不希望任何用户处于活动状态,因此 masterKey 将为零,我们不需要在受限模式下关闭和重新启动。但是,如果操作员想要强制执行此操作,我们允许他将标志 masterkey 设置为 1,这样数据库就会关闭,并且所有用户都将被删除,而不会出现任何问题。
  • 另一种方法是终止该用户会话。 stackoverflow.com/questions/15664924/…
  • @Xing 您提供的新脚本编辑效果很好。感谢您更新脚本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 2023-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
相关资源
最近更新 更多