我知道这个问题听起来可能太愚蠢了,但我一直不明白这部分。
SQL*Plus 适用于 SQL 和 PL/SQL。我如何知道某些代码是 SQL 还是 PL/SQL?如果我的代码有一个 for 循环,它不再是 SQL 了吗?
PL/SQL 是 SQL 的扩展,具有循环、条件等。那么任何 SQL 代码都是默认的 PL/SQL 代码?不是这样吗?
SQL 和 PL/SQL 之间有界限吗?
两个区分黑白 SQL 和 PL/SQL 的例子触发了这个问题:
https://stackoverflow.com/questions/2267386/oracle-11g-varray-of-objects/2267813#2267813
如果包裹在
BEGIN
...END
DECLARE
...END
CREATE OR REPLACE
...END
EXECUTE
然后是PL/SQL。这在引擎盖下意味着什么?
SELECT
SQL 被“编译”为查询计划并被执行,如果发生或在其他情况下受影响的行数或错误,则立即返回结果集。然而,PL/SQL 涉及更多。检查其中引用的每个对象是否存在和必要的授权,然后将 PL/SQL 编译为接近本机的代码,以全速执行。跟踪依赖关系,如果表发生更改,则任何引用它的 PL/SQL 都需要重新编译。原因是速度。由于一切都是在编译时预先完成的,因此不需要在 PL/SQL 中进行任何运行时检查,而每次都必须检查 SQL 语句(即使查询计划被缓存,即所谓的软解析,仍然必须检查权限,即使是软解析也有与之相关的成本)。这是 Oracle 所做的存储过程的“杀手锏”之一。实际执行 PL/SQL 存储过程或触发器会执行绝对最少的计算量来获得结果。在不受信任的 Oracle 内核之外运行的应用程序代码必须跳过更多的环节才能获取数据。对于像 OCaml 或 Haskell 这样的强类型、引用透明的高级语言来说,这也是同样的论点——在编译时做更多的工作,并从代码执行的数百万时间中获益。
可以肯定的是,这是一个有趣的问题。大多数熟悉 Oracle 开发的人都不会考虑它,但是当你真正理解它时,有时会混淆 SQL 和 PL/SQL 之间的界限。
通过查看首字母缩略词的定义,您开始了解每个首字母缩写词涵盖的功能领域:
SQL - 结构化查询语言
PL/SQL - 过程语言/结构化查询语言
细心的读者可能会注意到 SQL 是如何出现两次的 8) 那是因为 SQL 通常嵌入在 PL/SQL 中 - PL/SQL 是一种用于提供专有的第四代语言 (4GL)的语言,它与数据库对象在甲骨文。
维基百科有一些关于SQL和PL/SQL的非常好的材料
令人困惑的部分是 PL/SQL 和 SQL 有一点重叠。SQL 的权限包括数据插入、查询、更新和删除,即所谓的 DML 或数据操作语言操作,但它也包括创建、更改、重命名、删除这些 DDL 或数据定义语言操作。它在这里有些人可能会感到困惑。创建存储过程的操作(使用 PL/SQL 编写的东西)实际上是 SQL——您使用 SQL 创建表示 PL/SQL 块的数据库对象。
同样,您可以在 PL/SQL 中嵌入 SQL 代码。例如,PL/SQL 中的 FOR 循环可以基于 SQL 查询。有点让你大吃一惊,嗯?您使用 SQL 创建一个过程,该过程实际上在内部使用 SQL 对数据库中的记录执行某些操作。
如果你问我,很酷的东西。
SQL 是标准*。
PL/SQL 是 SQL 标准的供应商扩展*。
*SQL 是一种语言,它具有明确的语法和关于如何实现该语法的规则,并且
本身是但不是标准 的。但是,既然有一个每个人都可以同意的语言规范,那么如果程序只用 SQL 编写,那么用 SQL 编写的任何东西都是可移植的。但是因为 PL/SQL 是供应商扩展,它会有其他供应商可能不支持的语言部分。