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命令执行的规则基本是:
- 遇到分号时执行当前文本。因此,如果一行不以分号结尾,则继续收集当前文本。
- 如果遇到
DECLARE
或BEGIN
,收集所有文本,不要在分号上执行
- 如果遇到斜杠(
/
),执行采集的文本。
那么在你的案例中发生的情况是,分号和斜杠都执行了 DROP
语句。
要修复它,请删除斜杠。
如果你有一个 PL/SQL 块,你只需要斜杠,它总是带有一个 END
语句。对其他所有内容使用分号。
注意:以上规则经过简化。它在实践中更复杂。
一些示例将有助于理解规则:
- 下面的代码会执行一次
begin
dbms_output.put_line('executed');
end;
/
- 以下代码将不会执行(缺少分号)
begin
dbms_output.put_line('executed')
end
/
- 下面的代码会执行两次
begin
dbms_output.put_line('executed');
end;
/
/
- 下面的代码会执行一次
select 1 from dual
/
- 下面的代码会执行一次
select 1 from dual;
- 下面的代码会执行两次
select 1 from dual;
/
在 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命令执行的规则基本是:
- 遇到分号时执行当前文本。因此,如果一行不以分号结尾,则继续收集当前文本。
- 如果遇到
DECLARE
或BEGIN
,收集所有文本,不要在分号上执行 - 如果遇到斜杠(
/
),执行采集的文本。
那么在你的案例中发生的情况是,分号和斜杠都执行了 DROP
语句。
要修复它,请删除斜杠。
如果你有一个 PL/SQL 块,你只需要斜杠,它总是带有一个 END
语句。对其他所有内容使用分号。
注意:以上规则经过简化。它在实践中更复杂。
一些示例将有助于理解规则:
- 下面的代码会执行一次
begin
dbms_output.put_line('executed');
end;
/
- 以下代码将不会执行(缺少分号)
begin
dbms_output.put_line('executed')
end
/
- 下面的代码会执行两次
begin
dbms_output.put_line('executed');
end;
/
/
- 下面的代码会执行一次
select 1 from dual
/
- 下面的代码会执行一次
select 1 from dual;
- 下面的代码会执行两次
select 1 from dual;
/