在Oracle SQL中,何时需要使用分号和斜杠?

在Oracle SQL中,何时需要使用分号和斜杠?

本周,我们在我的公司就如何编写SQL脚本进行了一些讨论。

背景:我们的数据库是Oracle 10g(升级到11很快)。我们的DBA团队使用SQLPlus来将脚本部署到生产中。

现在,我们最近的部署失败了,因为它同时使用了分号和正斜杠(/)。分号在每个语句的末尾,斜杠在语句之间。

alter table foo.bar drop constraint bar1;/alter table foo.can drop constraint can1;/

后面在脚本中添加了一些触发器,创建了一些视图以及一些存储过程。同时拥有;/导致每个语句运行两次,导致错误(特别是在需要唯一的插入上)。

在SQLDeveloper中,这种情况不会发生,在TOAD中则不会发生。如果运行某些命令,则没有/在他们身上。

在PL/SQL中,如果您有一个子程序(声明、开始、结束),所使用的分号将被视为子程序的一部分,因此必须使用斜杠。

所以我的问题是:如果您的数据库是Oracle,那么编写SQL脚本的正确方法是什么?因为您知道您的DB是Oracle,所以应该始终使用/?


茅侃侃
浏览 2134回答 3
3回答

温温酱

这是一个优先考虑的问题,但我更愿意看到持续使用斜杠的脚本-这样,所有的“工作单元”(创建PL/SQL对象、运行PL/SQL匿名块和执行DML语句)都可以通过眼睛更容易地识别出来。另外,如果您最终转向类似Ant的部署,那么它将简化目标的定义,使其具有一致的语句分隔符。

慕容森

我知道这是一个老生常谈,但我只是偶然发现,我觉得这一点还没有得到完全解释。在SQL*Plus中,/和一个;因为他们的工作方式不同。这个;结束SQL语句,而/执行当前“缓冲区”中的任何内容。所以当你使用; 和 a /该语句实际上执行了两次。您可以很容易地看到,使用/运行语句之后:SQL*Plus: Release 11.2.0.1.0 Production on Wed Apr 18 12:37:20 2012Copyright (c) 1982, 2010, Oracle.   All rights reserved.Connected to:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - ProductionWith the Partitioning and OLAP options SQL> drop table foo;Table dropped.SQL> /drop table foo           *ERROR at line 1:ORA-00942: table or view does not exist在这种情况下,人们实际上注意到了错误。但是,假设有这样的SQL脚本:drop table foo;/这是从SQL*Plus内部运行的,这将非常令人困惑:SQL*Plus: Release 11.2.0.1.0 Production on Wed Apr 18 12:38:05 2012Copyright (c) 1982, 2010, Oracle.   All rights reserved.Connected to:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - ProductionWith the Partitioning and OLAP options SQL> @dropTable dropped.drop table foo           *ERROR at line 1:ORA-00942: table or view does not exist这个/主要是为了运行嵌入了;就像CREATE PROCEDURE声明。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

MySQL
Oracle