为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

茅侃侃 2019-06-12 16:29:23
在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,所以应该始终使用/?
查看完整描述

3 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

这是一个优先考虑的问题,但我更愿意看到持续使用斜杠的脚本-这样,所有的“工作单元”(创建PL/SQL对象、运行PL/SQL匿名块和执行DML语句)都可以通过眼睛更容易地识别出来。

另外,如果您最终转向类似Ant的部署,那么它将简化目标的定义,使其具有一致的语句分隔符。


查看完整回答
反对 回复 2019-06-12
?
慕容森

TA贡献1853条经验 获得超18个赞

我知道这是一个老生常谈,但我只是偶然发现,我觉得这一点还没有得到完全解释。

在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声明。


查看完整回答
反对 回复 2019-06-12
  • 3 回答
  • 0 关注
  • 2132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信