如何区分 SQL 和 PL/SQL?

Laz*_*zer 16 oracle oracle-11g-r2 sqlplus plsql

我知道这个问题可能听起来太愚蠢了,但我从来没有理解这部分。

SQL*Plus 适用于 SQL 和 PL/SQL。我如何知道某些代码是 SQL 还是 PL/SQL?如果我的代码有 for 循环,它就不再是 SQL 了吗?

PL/SQL 是 SQL 的扩展,具有循环、条件等。那么任何 SQL 代码默认都是 PL/SQL 代码?不是这样吗?

SQL 和 PL/SQL 之间有分界线吗?

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

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

/sf/ask/158717051/#2267813

Gai*_*ius 12

如果它被包裹在

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

然后是PL/SQL。这意味着什么?SQL 被“编译”为查询计划并执行,SELECT在其他情况下或受影响的行数或错误的情况下立即返回结果集。然而,PL/SQL 涉及更多。检查其中引用的每个对象是否存在并获得必要的授权,然后将 PL/SQL 编译为接近本机的代码,并全速执行。依赖关系被跟踪,如果一个表发生变化,那么任何引用它的 PL/SQL 都需要重新编译。原因是速度;因为一切都是在编译时预先完成的,所以不需要在 PL/SQL 中进行任何运行时检查,而每次都必须检查 SQL 语句(即使查询计划被缓存,所谓的软解析,仍然必须检查权限,即使是软解析也有与之相关的成本)。

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

  • 要添加到组合 CALL 是用于执行存储的程序单元的 SQL 语句,并在后台重写为 BEGIN...END (2认同)
  • 和 EXECUTE 一样,它是语法糖 (2认同)

Sco*_*her 12

可以肯定的是,这是一个有趣的问题。大多数熟悉 Oracle 开发的人都不会考虑它,但是当你深入研究它时,有时会混淆 SQL 和 PL/SQL 之间的界限。

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

SQL - 结构化查询语言

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

细心的读者可能会注意到 SQL 是如何出现两次的 8) 那是因为 SQL 通常嵌入在 PL/SQL 中 - PL/SQL 是一种语言,旨在提供专有的第 4 代语言 (4GL),可以很好地处理数据库对象甲骨文。

维基百科有一些关于SQLPL/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 语句的 PL/SQL 函数等。 (2认同)

jco*_*and 5

SQL 和 PL/SQL 之间有分界线吗?

SQL 是标准*。

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

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

但是因为 PL/SQL 是供应商扩展,它会包含其他供应商可能不支持的语言部分。

  • 我会说 PL/SQL 是事实上的标准,而 SQL 是法律上的标准 :-) (3认同)
  • @Gaius 仅从那句话我就猜到两件事:你是一个 ORA 开发者,你认为 TSQL 只是一团糟:p (3认同)