-->

SQLPlus is trying to drop package twice

2019-02-25 16:00发布

问题:

While executing scripts in SQLPlus I've encountered a problem:

script.sql contains the following lines

@some_pkg.pks
@some_pkg.pkb

drop package some_pkg;
/

After calling

> sqlplus user/password@dbname @script.sql

the following messages are in console:

Package created.
Package body created.
Package dropped.

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

Please, explain what's happening here. Looks like the package is being dropped twice. Is it possible to avoid the error?

回答1:

The rules of SQLplus command execution basically are:

  • Execute the current text when you encounter a semi-colon. Thus if a line doesn't end with a semi-colon, the current text continues to be collected.
  • If you encounter DECLARE or BEGIN, collect all the text and do not execute on semi-colons
  • If you encounter a slash (/), execute the collected text.

So what happens in your cases is, that both the semi-colon and the slash execute the DROP statements.

To fix it, remove the slash.

You only need the slash if you have a block of PL/SQL, which always with an END statement. Use semicolons for everything else.

Note: the above rules are simplified. It's more complex in practice.