如何区分SQL和PL / SQL?


16

我知道这个问题听起来太愚蠢了,但是我从不理解这部分。

SQL * Plus可与SQL和PL / SQL一起使用。我怎么知道某些代码是SQL还是PL / SQL?如果我的代码具有for循环,那么它不再是SQL吗?

PL / SQL是SQL的扩展,使其具有循环,条件等。那么默认情况下,任何SQL代码是PL / SQL代码吗?是不是

SQL和PL / SQL之间是否有界线?

触发该问题的区分黑白SQL和PL / SQL的两个示例:

这两个create table语句有什么区别?

/programming/2267386/oracle-11g-varray-of-objects/2267813#2267813

Answers:


12

可以肯定,这是一个有趣的问题。大多数熟悉Oracle开发的人不会想到它,但是当您深入研究它时,有时很难定义SQL和PL / SQL之间的界限。

通过查看首字母缩略词的定义,您开始了解每个功能涵盖的功能领域:

SQL-结构化查询语言

PL / SQL-过程语言/结构化查询语言

细心的读者可能会注意到SQL如何显示两次8)这是因为SQL通常嵌入在PL / SQL中-PL / SQL是一种用于提供专有的第四代语言(4GL)的语言。很好地与数据库对象配合使用。甲骨文

维基百科在SQLPL / SQL上都有相当不错的资料

令人困惑的是PL / SQL和SQL有点重叠。SQL的权限包括数据插入,查询,更新和删除(所谓的DML或数据操作语言操作),但它还包括DDL或数据定义语言操作的创建,更改,重命名,删除。在这里,有些人可能会感到困惑。创建存储过程(使用PL / SQL编写的东西)的操作实际上是SQL-您使用SQL创建代表PL / SQL块的数据库对象。

同样,您可以将SQL代码嵌入PL / SQL中。例如,PL / SQL中的FOR循环可以基于SQL查询。有点不高兴,是吗?您使用SQL创建一个过程,该过程实际上在内部使用SQL对数据库中的记录执行某些操作。

如果你问我,很酷的东西。


2
确实,这条线是模糊的。你可以写一个SQL语句来创建具有一个SQL语句中有一个PL / SQL程序调用该有它的SQL语句等一个PL / SQL函数
雷Riffel

1
@轻走兔子洞吧!
ScottCher 2011年

我不会说那条线很模糊。PL / SQL是SQL的过程包装器。尽管不是必须的,但大多数PL / SQL都包含SQL语句。您可以跟踪实际的SQL游标v$sql
威廉·罗伯逊

12

如果包装

  • BEGIN ... END
  • DECLARE ... END
  • CREATE OR REPLACE ... END
  • 是单线前缀 EXECUTE

然后是PL / SQL。这到底是什么意思?SQL被“编译”到查询计划并执行,如果SELECT在其他情况下受影响的行数或行数或发生错误,则立即返回结果集。但是,PL / SQL涉及更多。检查其中引用的每个对象是否存在和必要的授权,然后将PL / SQL编译为接近本机的代码,并以全速执行。跟踪依赖关系,如果表发生更改,则引用该表的任何PL / SQL都需要重新编译。原因是速度。由于所有操作都是在编译时预先完成的,因此无需在PL / SQL中进行任何运行时检查,而SQL语句必须每次都进行检查(即使查询计划已缓存,也就是所谓的软解析),仍然必须检查特权,即使是软解析也要付出代价。

这是Oracle进行存储过程的“杀手advantages”之一;实际执行PL / SQL存储的proc或触发器会进行绝对最小数量的计算以获得结果。在不受信任的Oracle内核外部运行的应用程序代码必须经过更多的循环才能获取数据。对于强类型的,引用透明的高级语言(例如OCaml或Haskell),这是相同的论点-在编译时执行一次更多工作,并从执行代码的数百万时间中受益。


2
要添加到混合中,CALL是用于执行存储的程序单元的SQL语句,并且
Gary

2
正如EXECUTE一样,它是语法糖
Gaius

5

SQL和PL / SQL之间是否有界线?

SQL是标准*。

PL / SQL是SQL标准*的供应商扩展。

* SQL是一种语言,具有明确的语法和应如何实现该语法的规则,并且它 本身不是 标准的 语法。但是,由于有一种语言规范,每个人都可以同意,所以如果程序仅使用SQL编写,那么用SQL编写的任何内容都是可移植的。

但是因为PL / SQL是供应商扩展,所以它将具有其他供应商可能不支持的语言部分。


3
我会说PL / SQL是事实上的标准,而SQL是法律上的标准:-)
Gaius

3
@Gaius,仅从该语句中,我会猜出两件事:您是ORA开发人员,并且您认为TSQL太乱了:p
jcolebrand

@jcolebrand我的第一个DBA工作实际上是在Sybase上,但是您是对的,这些天我主要在Oracle工作。如果您可以在任一数据库上编写T-SQL或PL / SQL,我会很高兴,但是这些语言反映了它们的平台(例如T-SQL就是这样,因为游标和锁在SQL Server及其后代中很昂贵,而PL / SQL就是这样,因为Oracle的某人上次在国防部工作过:-)
Gaius,

@Gaius Ah,是的,关于标准之所以如此好的旧论点是因为有太多选择。我认为表明SQL是“标准”以及PL / SQL是专有的所以+1 @jcolebrand很好。
ScottCher 2011年

@ScottCher〜谢谢。我说这是一个标准很愚蠢,因为没有(afaik)标准机构在其上盖上认可印章并给其编号。但这是定义明确并达成共识的。;)
jcolebrand
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.