Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLPlus尝试删除包两次_Sql_Oracle_Sqlplus_Sql Drop - Fatal编程技术网

SQLPlus尝试删除包两次

SQLPlus尝试删除包两次,sql,oracle,sqlplus,sql-drop,Sql,Oracle,Sqlplus,Sql Drop,在SQLPlus中执行脚本时,我遇到了一个问题: script.sql包含以下行 @some_pkg.pks @some_pkg.pkb drop package some_pkg; / 打完电话 >sqlplus用户/password@dbname@script.sql 控制台中有以下消息: Package created. Package body created. Package dropped. drop package some_pkg; * ERROR at line 1: O

在SQLPlus中执行脚本时,我遇到了一个问题:

script.sql包含以下行

@some_pkg.pks
@some_pkg.pkb

drop package some_pkg;
/
打完电话

>sqlplus用户/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
语句。其他所有内容都使用分号


注:以上规则已简化。实践中更为复杂。

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

  • 下面的代码将执行一次
  • 以下代码将不执行(缺少分号)
  • 下面的代码将执行两次
  • 下面的代码将执行一次
  • 下面的代码将执行一次
  • 下面的代码将执行两次

  • 一些_pkg.pks和一些_pkg.pkb的内容是什么?这是因为
    /
    再次运行最后一条语句。简短回答:不要在
    语句后使用
    /
    ,请参阅:或删除分号。。。斜杠本身仍然会在缓冲区中执行drop命令。(但要在代码中保持一致。)是的,我同意。但是,作为编写一致代码和帮助眼睛发现错误的简单规则,我建议只对PL/SQL块使用斜杠,否则使用分号。
    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;
    /