问题
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
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.
回答2:
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