代码之家  ›  专栏  ›  技术社区  ›  Tim unnamed eng

postgresql中的pl/pgsql和sql是否与sql/psm标准处于同一级别,而不是仅作为sql标准?[关闭]

  •  0
  • Tim unnamed eng  · 技术社区  · 7 年前

    术语: 在下面,PostgreSQL Server可以理解两种语言

    • PL/PGSQL;
    • 我同时使用“postgresql sql”和“postgresql中的sql”来表示同一个东西,postgresql服务器接收的命令的默认语言。postgresql sql“即postgresql中的sql”与sql中的sql不一样。

    我发现以下情况:

    因为postgresql sql已经 创建函数 而且sql标准没有存储过程,postgresql中的sql是否与sql/psm标准处于同一级别,而不是仅作为sql标准?

    postgresql和pl/pgsql中的sql是否与sql/psm标准处于同一级别?

    pl/pgsql与postgresql的关系是什么?

    • pl/pgsql是postgresql中sql的过程扩展,但是postgresql已经有了 创建函数 ?

    • 在postgresql中,pl/pgsql是sql的替代品吗?pl/pgsql的大部分功能也可以在postgresql sql中完成吗?

    如果postgresql中的pl/pgsql和sql都与sql/psm处于同一级别,那么哪个更接近sql/psm标准?

    谢谢。


    更多背景:

    我知道了 we have to use DO command in PostgreSQL SQL to specify using PL/pgSQL ,否则这些命令就在postgresql sql中。 在mysql中,我不需要做类似的事情,只需要编写mysql命令。所以我不清楚为什么我们同时拥有pl/pgsql和postgresql sql,并且必须通过 命令,而不是只使用其中一个命令,而不使用postgresql中混合pl/pgsql的尴尬。

    2 回复  |  直到 7 年前
        1
  •  3
  •   Mark Rotteveel    7 年前

    要澄清术语:

    SQL是 查询 用于在关系数据库中选择、更新、删除或创建数据的语言。它没有 procedural elements 类环 FOR , WHILE )或条件语句( IF , ELSE )或变量或光标。

    CREATE FUNCTION 实际上是一个“sql语句”,但仅仅是一个“包装器”,用于指定由不同于sql查询“引擎”的内容执行的代码块。postgres(与其他dbms不同)支持多个“运行时引擎”,它们可以执行传递给“create function”语句的代码块,其中一个结果是代码实际上是一个字符串,因此 创建函数 只看到一条线,没有别的。

    因为sql没有过程元素,所以不能混合过程代码和sql代码。如果你想运行程序代码,你需要告诉服务器你正在以某种方式切换“引擎”。这是通过(sql)完成的 DO 命令再次获取一个不知道该如何处理的字符串,将其发送到服务器,并说“这里有一段代码,用户声称引擎'xyz'可以在其中执行”- xyz 是pl/pgsql、python、perl还是完全不同的东西。

    这与Oracle中的匿名pl/sql块相同 DECLARE -之后的所有操作都由服务器上的另一个运行时引擎执行。mysql没有这样的功能。运行过程代码的唯一方法是创建过程(或函数),然后运行它。这就是为什么没有 在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


    postgresql中的sql“与sql-per-sql标准不同。

    这是真的。但是, dbms完全实现了sql标准,但是postgres的实现可能是最接近标准的。

        2
  •  1
  •   Laurenz Albe    7 年前

    sql是一种查询语言,而pl/pgsql是一种过程语言(它有如下语句 LOOP IF )

    过程语言用于编写函数;函数体可以用pl/pgsql编写。

    CREATE FUNCTION 是在数据库中定义函数对象的SQL语句。这样的函数可以在sql表达式中使用。

    sql/psm是定义存储过程语言的标准的一部分,因此sql/psm适用于pl/pgsql,但不适用于sql。

    但是,pl/pgsql不遵循sql/psm标准。

    没有人告诉您必须使用pl/pgsql,事实上,不使用它会使您的应用程序更具可移植性(在数据库端)。但是sql和过程语言是不同的(在postgresql和mysql中),您可能会发现两者都有其用途。