Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL中的PL/pgSQL和SQL是否与SQL/PSM标准处于同一级别,而不是仅作为SQL标准?_Sql_Postgresql_Plpgsql - Fatal编程技术网

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

PostgreSQL中的PL/pgSQL和SQL是否与SQL/PSM标准处于同一级别,而不是仅作为SQL标准?,sql,postgresql,plpgsql,Sql,Postgresql,Plpgsql,术语:以下是PostgreSQL server可以理解的两种语言 PL/pgSQL 我使用“PostgreSQL”和“PostgreSQL中的SQL”来指代相同的东西,即PostgreSQL server接收的命令的默认语言。“PostgreSQL”即“PostgreSQL中的SQL”与SQL标准中的SQL不同 我发现了以下观察结果: PostgreSQL和PL/pgSQL中的SQL都可以通过自己的create FUNCTION语句创建函数(实际上是存储过程)。我读 但是PL/pgSQL

术语:以下是PostgreSQL server可以理解的两种语言

  • PL/pgSQL
  • 我使用“PostgreSQL”和“PostgreSQL中的SQL”来指代相同的东西,即PostgreSQL server接收的命令的默认语言。“PostgreSQL”即“PostgreSQL中的SQL”与SQL标准中的SQL不同

我发现了以下观察结果:

  • PostgreSQL和PL/pgSQL中的SQL都可以通过自己的
    create FUNCTION
    语句创建函数(实际上是存储过程)。我读

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

由于PostgreSQL具有
创建函数
,并且SQL标准没有存储过程,因此PostgreSQL中的SQL是否与SQL/PSM标准处于同一级别,而不是仅作为SQL标准

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

PL/pgSQL和PostgreSQL之间的关系是什么

  • PL/pgSQL是否是PostgreSQL中SQL的过程扩展,但PostgreSQL已经有了
    创建函数

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

如果PostgreSQL中的PL/pgSQL和SQL与SQL/PSM处于同一级别,那么哪个更接近SQL/PSM标准

谢谢


更多背景信息:

我了解到了这一点,否则这些命令只是在PostgreSQL中。
在MySQL中,我从来不需要做类似的事情,只需要编写MySQL命令。所以我不清楚为什么我们同时使用PL/pgSQL和PostgreSQL,并且必须通过
DO
命令在PostgreSQL中使用PL/pgSQL,而不是仅仅使用其中一个,而不必在PostgreSQL中混合PL/pgSQL

SQL是一种查询语言,而PL/pgSQL是一种过程语言(它有
LOOP
IF

过程语言用于编写函数;函数体可以用PL/pgSQL编写

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

SQL/PSM是定义存储过程语言的标准的一部分,因此SQL/PSM适用于PL/pgSQL,但不适用于SQL

但是,PL/pgSQL不遵循SQL/PSM标准


没有人告诉您必须使用PL/pgSQL,事实上,不使用PL/pgSQL会使应用程序(在数据库端)更具可移植性。但是SQL和过程语言是不同的(在PostgreSQL和MySQL中),您可能会发现它们都有各自的用途。

SQL是一种查询语言,而PL/pgSQL是一种过程语言(它有类似于
LOOP
IF
的语句)

过程语言用于编写函数;函数体可以用PL/pgSQL编写

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

SQL/PSM是定义存储过程语言的标准的一部分,因此SQL/PSM适用于PL/pgSQL,但不适用于SQL

但是,PL/pgSQL不遵循SQL/PSM标准


没有人告诉您必须使用PL/pgSQL,事实上,不使用PL/pgSQL会使应用程序(在数据库端)更具可移植性。但是SQL和过程语言是不同的(在PostgreSQL和MySQL中),您可能会发现它们都有各自的用途。

为了澄清术语:

SQL是一种查询语言,用于选择、更新、删除或创建关系数据库中的数据。它没有类似的循环(
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没有这样的功能。运行过程代码的唯一方法是创建一个过程(或函数),然后运行该过程。这就是为什么MySQL中没有
DO
这样的东西

SQL Server是唯一一个没有明确区分过程代码和“普通SQL”的DBMS产品:T-SQL是SQL语言的扩展,它允许您混合使用“常规SQL”和过程SQL,而无需告诉后端代码需要不同的引擎来运行(这对于从SQL Server迁移到Postgres或Oracle的人来说是一个很大的困惑)

SQL/PSM是一种标准,它定义了可嵌入数据库中的过程元素