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 的两个示例:
Gai*_*ius 12
如果它被包裹在
BEGIN ... ENDDECLARE ... ENDCREATE OR REPLACE ... ENDEXECUTE然后是PL/SQL。这意味着什么?SQL 被“编译”为查询计划并执行,SELECT在其他情况下或受影响的行数或错误的情况下立即返回结果集。然而,PL/SQL 涉及更多。检查其中引用的每个对象是否存在并获得必要的授权,然后将 PL/SQL 编译为接近本机的代码,并全速执行。依赖关系被跟踪,如果一个表发生变化,那么任何引用它的 PL/SQL 都需要重新编译。原因是速度;因为一切都是在编译时预先完成的,所以不需要在 PL/SQL 中进行任何运行时检查,而每次都必须检查 SQL 语句(即使查询计划被缓存,所谓的软解析,仍然必须检查权限,即使是软解析也有与之相关的成本)。
这是 Oracle 存储过程的“杀手级优势”之一;实际执行 PL/SQL 存储过程或触发器会进行绝对最少的计算以获得结果。在不受信任的 Oracle 内核之外运行的应用程序代码必须跳过更多环节才能获取数据。对于强类型、引用透明的高级语言(如 OCaml 或 Haskell)来说,这是相同的论点——在编译时做更多的工作,并从执行代码的数百万次中获益。
Sco*_*her 12
可以肯定的是,这是一个有趣的问题。大多数熟悉 Oracle 开发的人都不会考虑它,但是当你深入研究它时,有时会混淆 SQL 和 PL/SQL 之间的界限。
通过查看首字母缩略词的定义,您开始了解每个首字母缩略词涵盖的功能领域:
SQL - 结构化查询语言
PL/SQL - 过程语言/结构化查询语言
细心的读者可能会注意到 SQL 是如何出现两次的 8) 那是因为 SQL 通常嵌入在 PL/SQL 中 - PL/SQL 是一种语言,旨在提供专有的第 4 代语言 (4GL),可以很好地处理数据库对象甲骨文。
令人困惑的部分是 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 是标准*。
PL/SQL 是 SQL 标准的供应商扩展*。
*SQL 是一种语言,它具有明确的语法和有关如何实现该语法的规则,并且 本身不是 标准 。但是,由于存在每个人都同意的语言规范,因此如果程序仅用 SQL 编写,那么用 SQL 编写的任何内容都是可移植的。
但是因为 PL/SQL 是供应商扩展,它会包含其他供应商可能不支持的语言部分。