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?
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
orBEGIN
, 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.
Some examples will help to understand rules:
- Below code will be executed once
begin
dbms_output.put_line('executed');
end;
/
- Below code will not execute (missing semicolon)
begin
dbms_output.put_line('executed')
end
/
- Below code will be executed twice
begin
dbms_output.put_line('executed');
end;
/
/
- Below code will be executed once
select 1 from dual
/
- Below code will be executed once
select 1 from dual;
- Below code will be executed twice
select 1 from dual;
/
来源:https://stackoverflow.com/questions/28209880/sqlplus-is-trying-to-drop-package-twice