代码之家  ›  专栏  ›  技术社区  ›  Ugy Astro

准备stmt作为PostgreSQL中Concat的结果

  •  2
  • Ugy Astro  · 技术社区  · 7 年前

    如果这个问题这么简单,我很抱歉。我有一些可以在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 ,运行查询时是否有任何不同的结果?如果使用 准备 优点是什么?

    谢谢专家!

    1 回复  |  直到 7 年前
        1
  •  1
  •   Laurenz Albe    7 年前

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

    因此,如果您想在PL/pgSQL中执行一条准备好的语句,就必须使用动态SQL来避免PL/pgSQL之间的混淆 执行 和同名的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