【问题标题】:PREPARE stmt AS result of Concat in PostgreSQLPREPARE stmt 作为 PostgreSQL 中 Concat 的结果
【发布时间】:2018-08-21 05:31:28
【问题描述】:

如果这个问题如此简单,我很抱歉。我有一些可以在 MySQL 存储过程中正常运行的查询。但是现在我将它迁移到 PostgreSQL,该查询是来自另一个查询的 Concat 的结果。查询就像这样:

DECLARE

A TEXT;

BEGIN

A = concate(sql);  /*in MySQL I just use SET A = CONCATE(sql)*/

PREPARE stmt AS A; /* in MySQL normally run with PREPARE stmt FROM A;*/
EXECUTE stmt;

END

但我总是得到一个错误:

ERROR:  syntax error at or near "A"
LINE 85:  PREPARE stmt AS A;

我的问题是:

  1. 如何访问变量A 使其正常运行?
  2. 不管有没有PREPARE,运行查询的结果有什么不同吗?如果使用PREPARE有什么好处?

感谢专家!

【问题讨论】:

标签: mysql postgresql database-migration concat


【解决方案1】:

您可以在 PL/pgSQL 中创建和使用准备好的语句,但请记住,PL/pgSQL 的 EXECUTE 与 SQL 语句 EXECUTE 不同。

所以如果要在 PL/pgSQL 中执行准备好的语句,就必须使用动态 SQL,以避免 PL/pgSQL 的 EXECUTE 与同名 SQL 语句混淆。

DO $$BEGIN PREPARE x AS SELECT 42; END;$$;

EXECUTE x;

 ?column? 
----------
       42
(1 row)

DO
$$DECLARE a integer;
BEGIN
   EXECUTE 'EXECUTE x' INTO a;
   RAISE NOTICE 'a = %', a;
END;$$;

NOTICE:  a = 42

【讨论】:

  • 谢谢先生,您的解释很有帮助。查询运行良好,如您的示例。当我搜索时,我没有找到像你解释的那样。因此,MySQL 和 PostgreSQL 在使用 PREPARE 时的主要区别在于在 PREPARE label'PREPARE label' 之前添加 EXECUTE'(单引号)。对吗?
  • 我意识到我的回答令人困惑。实际上,你不需要动态 SQL(PL/pgSQL 的EXECUTE)来运行PREPARE,但是你需要它来运行SQL 命令EXECUTE,以避免混淆这两种EXECUTE。请参阅我修改后的答案。
猜你喜欢
  • 1970-01-01
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-05
  • 1970-01-01
  • 2017-01-01
相关资源
最近更新 更多