澄清术语:
SQL 是一个query用于在关系数据库中选择、更新、删除或创建数据的语言。它没有程序要素 https://en.wikipedia.org/wiki/Procedural_programming就像循环一样(FOR
, WHILE
) 或条件语句 (IF
, ELSE
) 或变量或游标。
CREATE FUNCTION
确实是一个“SQL 语句”,但它只是一个“包装器”,用于指定由不同于 SQL 查询“引擎”的东西执行的代码块。 Postgres(与其他 DBMS 不同)支持多个“运行时引擎”,这些引擎可以执行传递给“CREATE FUNCTION”语句的代码块 - 其中一个工件是代码实际上是一个字符串,因此CREATE FUNCTION
只看到一个字符串,没有其他任何东西。
由于 SQL 没有过程元素,因此不能混合过程代码和 SQL 代码。如果您想运行程序代码,您需要告诉服务器您正在以某种方式切换“引擎”。这是通过(SQL)完成的DO
命令再次接受一个它不知道如何处理的字符串,将其发送到服务器并说“这是一段代码,用户声称引擎‘xyz’可以执行”-xyz
是 PL/pgSQL、Python、Perl 或完全不同的东西。
这与您开始使用的 Oracle 中的匿名 PL/SQL 块相同DECLARE
- 之后的所有内容都由服务器上的不同运行时引擎执行。 MySQL没有这样的功能。运行过程代码的唯一方法是创建一个过程(或函数),然后运行它。这就是为什么不存在这样的事情DO
在 MySQL 中。
唯一没有明确区分过程式代码和“普通 SQL”的 DBMS 产品是 SQL Server:T-SQL 是 SQL 语言的扩展,它允许您混合“常规 SQL”和过程式 SQL,而无需告诉后端代码需要不同的引擎来运行(这对于从 SQL Server 迁移到 Postgres 或 Oracle 的人们来说是一个很大的困惑)。
SQL/PSM 是一个标准,它定义了可以嵌入到使用 SQL 作为查询语言的数据库引擎中的过程元素。据我所知,没有任何 DBMS 产品能够真正实现 SQL/PSM。 Postgres的PL/pgSQL、Oracle的PL/SQL、MySQL的过程方言与此有些相似,但远不符合SQL/PSM标准。我认为最接近 SQL/PSM 标准的是 DB2,也许HSQLDB http://hsqldb.org/doc/2.0/guide/sqlroutines-chapt.html#src_psm_routines
PostgreSQL 中的 SQL 与 SQL 标准中的 SQL 不同。
那是真实的。但是之后,noDBMS 完全实现了 SQL 标准 - 但 Postgres 的实现可能是最接近标准的一种。