SQL*Plus 脚本执行两次

Ets*_*liv 1 oracle ksh sqlplus

我正在尝试使用 sqlplus 运行脚本。我的脚本是一个简单的删除语句。我通过将以下内容放入我的 ksh 终端来执行它:

sqlplus username/'password' @../sql/delete_societes.sql
Run Code Online (Sandbox Code Playgroud)

../sql/delete_societes.sql 是

DELETE FROM f2020.SOCIETES;
/
Run Code Online (Sandbox Code Playgroud)

出于某种原因,它运行了两次,导致输出“0 行被删除”被打印两次并在我尝试执行插入而不是删除时导致错误。

Ale*_*ole 8

使您的脚本执行任一操作;

DELETE FROM f2020.SOCIETES
/
Run Code Online (Sandbox Code Playgroud)

或者

DELETE FROM f2020.SOCIETES;
Run Code Online (Sandbox Code Playgroud)

没有斜线。

从文档

/(削减)

执行存储在 SQL 缓冲区中的最近执行的 SQL 命令或 PL/SQL 块。

在下面的例子中:

输入斜线(/)重新执行缓冲区中的命令

......这正是你所看到的。

在这些文档的其他地方

分号 (;) 表示这是命令的结尾。按回车键或单击执行。SQL*Plus 处理命令并显示结果

像许多客户端一样,SQL*Plus 将 SQL 语句末尾的分号视为语句分隔符 - 它不是语句本身的一部分(这会导致一些混淆,例如动态 SQL 和 JDBC 调用) - 当它看到它时它会执行命令。执行的语句留在命令缓冲区中;如果你list看到当前的命令缓冲区,它不会显示那个分号。当您发出斜杠时,它会再次执行缓冲区。


PL/SQL 的情况略有不同;PL/SQL 块必须以分号结束,分号块的一部分,并出现在缓冲区中。您必须使用斜杠来执行 PL/SQL 块