PostgreSQL 中的 PL/pgSQL 和 SQL 是否与 SQL/PSM 标准处于同一级别,而不仅仅是 SQL 标准? [关闭]

2024-04-08

术语:以下是 PostgreSQL 服务器可以理解的两种语言

  • PL/pgSQL;
  • 我使用“PostgreSQL SQL”和“PostgreSQL 中的 SQL”来指代同一事物,即 PostgreSQL 服务器接收的命令的默认语言。 “PostgreSQL SQL”即“PostgreSQL 中的 SQL”与 SQL 标准中的 SQL 不同。

我发现了以下观察结果:

  • PostgreSQL中的SQL和PL/pgSQL都可以自己创建函数(实际上是存储过程)CREATE FUNCTION声明。我读PostgreSQL函数中sql语言和plpgsql语言的区别 https://stackoverflow.com/questions/24755468/difference-between-language-sql-and-language-plpgsql-in-postgresql-functions

  • 但是PL/pgSQL允许变量赋值,而我没有发现PostgreSQL中的SQL允许变量赋值。

由于 PostgreSQL SQL 有CREATE FUNCTION并且SQL标准没有存储过程,PostgreSQL中的SQL是否与SQL/PSM标准处于同一级别,而不仅仅是SQL标准?

PostgreSQL 和 PL/pgSQL 中的 SQL 与 SQL/PSM 标准处于同一级别吗?

PL/pgSQL 和 PostgreSQL SQL 之间有什么关系?

  • PL/pgSQL 是 PostgreSQL 中 SQL 的过程扩展吗?但是 PostgreSQL SQL 已经有了CREATE FUNCTION?

  • PL/pgSQL 是 PostgreSQL 中 SQL 的替代品吗? PL/pgSQL 能做的大部分事情也可以在 PostgreSQL SQL 中完成吗?

如果 PL/pgSQL 和 PostgreSQL 中的 SQL 都与 SQL/PSM 处于同一级别,那么哪一个更符合 SQL/PSM 标准呢?

Thanks.


更多背景:

我了解到我们必须使用DOPostgreSQL SQL 中的命令指定使用 PL/pgSQL https://stackoverflow.com/posts/comments/88701326?noredirect=1,否则命令仅在 PostgreSQL SQL 中。 在MySQL中,我从来不需要做类似的事情,而只是编写MySQL命令。所以我不清楚为什么我们同时拥有 PL/pgSQL 和 PostgreSQL SQL,并且必须通过以下方式在 PostgreSQL SQL 中使用 PL/pgSQLDO命令,而不是只使用其中之一,而不会出现在 PostgreSQL SQL 中混合 PL/pgSQL 的尴尬。


澄清术语:

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 的实现可能是最接近标准的一种。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PostgreSQL 中的 PL/pgSQL 和 SQL 是否与 SQL/PSM 标准处于同一级别,而不仅仅是 SQL 标准? [关闭] 的相关文章

  • 对于返回超过1个值的SQL select,当Id为GUID时它们如何排序?

    我想知道 SQL Server 如何对查询返回的数据进行排序 并且各个表的 Id 列都是 uniqueidentifier 类型 我在创建所有 GUID 时使用 NHibernate GuidComb 并执行以下操作 Sheet sheet
  • SQL Server 批量插入 - “批量加载数据转换错误”

    bulk insert dbo A FROM d AData csv WITH FIELDTERMINATOR ROWTERMINATOR n 将批量数据插入数据库时 在检查可疑数据后 我遇到了无法解释的错误 消息 4867 16 级 状态
  • nvarchar 值“3001822585”的转换溢出了 int 列

    我使用以下方法将 Excel 文件导入到 SQL Server Excel 文件将所有值作为字符串 我可以导入文件 除了Barcode SalePrice and Price2 我收到错误 nvarchar 值 3001822585 条形码
  • Postgres:显示继承的字段

    我应该实现什么查询来获取继承的列 读过this http www alberton info postgresql meta info html综合帖子没有找到解决办法 如果我理解正确的话 您想知道作为表之间继承的一部分的列的名称 SELE
  • 最近邻居的 Postgis SQL

    我正在尝试计算最近的邻居 为此 我需要传递一个参数来限制与邻居的最大距离 例如 半径1000米内最近的邻居是哪些 我做了以下事情 我用数据创建了表 id name latitude longitude 之后 我执行了以下查询 SELECT
  • PostgreSQL 在递归查询中找到所有可能的组合(排列)

    输入是一个长度为 n 的数组 我需要生成数组元素的所有可能组合 包括输入数组中元素较少的所有组合 IN j A B C OUT k A AB AC ABC ACB B BA BC BAC BCA 随着重复 所以AB BA 我尝试过这样的事情
  • Django 中从 sqlite 迁移到 postgresql

    我想迁移自sqlite to PostgreSQL db 我安装了 postgresql 并在其 shell 上创建数据库 然后配置我的 django 设置如下 default ENGINE django db backends postg
  • SQL Server 2012:有条件地增加计数器用户 ROW_NUMBER()

    我正在尝试申请ROW NUMBER 根据特定条件增加计数器 我的数据如下所示 目标计数器是Prep column id DSR PrepIndicator Prep 1662835 1 1 1 1662835 14 2 2 1662835
  • 如何进行数据透视并计算列平均值

    我承认这是迄今为止我必须面对的最复杂的 SQL 语句之一 我在这件事上碰壁了 我希望有人能帮我一把 我在数据库中有这张表 Item ActiveTime sec DateTime 1 10 2013 06 03 17 34 22 gt Mo
  • Extbase - 从查询中获取创建的sql

    我想从我的typo3 扩展中获取一些数据库表 该扩展基于 extbase 查询总是不返回任何内容 但数据存在 我试过这个 query this gt createQuery query gt statement SELECT FROM my
  • 自动提取数据 - Oracle SQL Developer

    我通过 SQL Developer 连接到 Oracle 数据库 我想编写一个返回每月数据集的查询 然后将该数据提取到分隔文本文件中 我知道如何做到这一点就好了 我想知道是否有一种方法可以编写一个脚本来运行查询并在一年内逐月提取数据 这样我
  • Google App Engine Flexi 上 Django 的 Postgres 设置

    我正在尝试在应用程序引擎灵活环境中使用 postgres 设置 django 我按照这里的说明进行操作 https cloud google com appengine docs flexible python using cloud sq
  • SQLite (Android):使用 ORDER BY 更新查询

    Android SQLite 我想要在 myTable 中的其他行之间插入行在android中使用SQLite 为此 我尝试增加从第 3 行开始的所有行的 id 这样 我就可以在位置 3 处插入新行 myTable 的主键是列 id 表中没
  • 从 Django 调用 Postgres SQL 存储过程

    我正在开发一个带有 Postgresql 数据库的 Django 项目 我编写了一个可以在 Postgres 上完美运行的存储过程 现在我想从 Django 1 5 调用该存储过程 我已经编写了代码 但它提示错误 CREATE FUNCTI
  • 使用 .NET 中的类型化数据集将 SQL 参数传递给 IN() 子句

    首先道歉 因为该网站上有类似的问题 但没有一个直接回答这个问题 我在 VS 2010 中使用类型化数据集 我在数据集中创建一个 TableAdapter 查询如下 SELECT from Table WHERE ID IN IDs 现在如果
  • MySQL:如何获取每个分组的x个结果数[重复]

    这个问题在这里已经有答案了 可能的重复 mysql 在 GROUP BY 中使用 LIMIT 来获取每组 N 个结果 https stackoverflow com questions 2129693 mysql using limit w
  • 在 MS Access SQL 查询中从正常日期转换为 unix 纪元日期

    我正在尝试编写一个通过 ODBC 连接到 MySQL 数据库的 MS Access 2007 连接的查询 一切工作正常 查询执行我想要的操作 我挂断的部分是我一直在询问用户 unix 纪元时间 而不是常规日期 我查找了 MS Access
  • java库维护数据库结构

    我的应用程序一直在开发 所以偶尔 当版本升级时 需要创建 更改 删除一些表 修改一些数据等 通常需要执行一些sql代码 是否有一个 Java 库可用于使我的数据库结构保持最新 通过分析类似 db structure version 信息并执
  • 标量子查询包含多行

    我正在使用 H2 数据库并想要移动一些数据 为此 我创建了以下查询 UPDATE CUSTOMER SET EMAIL SELECT service EMAIL FROM CUSTOMER SERVICE AS service INNER
  • 配置“DataSource”以使用 SSL/TLS 加密连接到 Digital Ocean 上的托管 Postgres 服务器

    我正在尝试托管数据库服务 https www digitalocean com products managed databases on 数字海洋网 https en wikipedia org wiki DigitalOcean 创建了

随机推荐