SQLPlus 尝试删除包两次

SQLPlus is trying to drop package twice

在 SQLPlus 中执行脚本时遇到问题:

script.sql 包含以下行

@some_pkg.pks
@some_pkg.pkb

drop package some_pkg;
/

调用后

> sqlplus user/password@dbname @script.sql

以下消息在控制台中:

Package created.
Package body created.
Package dropped.

drop package some_pkg;
*
ERROR at line 1:
ORA-04043: object SOME_PKG does not exist

请解释这里发生了什么。看起来包裹被丢弃了两次。是否可以避免错误?

SQLplus命令执行的规则基本是:

  • 遇到分号时执行当前文本。因此,如果一行不以分号结尾,则继续收集当前文本。
  • 如果遇到DECLAREBEGIN,收集所有文本,不要在分号上执行
  • 如果遇到斜杠(/),执行采集的文本。

那么在你的案例中发生的情况是,分号和斜杠都执行了 DROP 语句。

要修复它,请删除斜杠。

如果你有一个 PL/SQL 块,你只需要斜杠,它总是带有一个 END 语句。对其他所有内容使用分号。

注意:以上规则经过简化。它在实践中更复杂。

一些示例将有助于理解规则:

  1. 下面的代码会执行一次
begin
  dbms_output.put_line('executed');
end;
/
  1. 以下代码将不会执行(缺少分号)
begin
  dbms_output.put_line('executed')
end
/
  1. 下面的代码会执行两次
begin
  dbms_output.put_line('executed');
end;
/
/
  1. 下面的代码会执行一次
select 1 from dual
/
  1. 下面的代码会执行一次
select 1 from dual;
  1. 下面的代码会执行两次
select 1 from dual;
/