【问题标题】:Dynamic Query Creation and Execution PostgreSQL动态查询创建和执行 PostgreSQL
【发布时间】:2015-10-27 12:25:26
【问题描述】:

我有下面两个表和两个pl/pgsql 函数。

CREATE TABLE tt1(id int, name text);
CREATE TABLE tt2(id int, name text);

INSERT INTO tt1 VALUES (1,'name1');
INSERT INTO tt1 VALUES (2,'name2');
INSERT INTO tt1 VALUES (3,'name3');
INSERT INTO tt2 VALUES (4,'name4');
INSERT INTO tt2 VALUES (5,'name5');
INSERT INTO tt2 VALUES (6,'name6');


CREATE OR REPLACE FUNCTION query_string() RETURNS TEXT  AS
$BODY$
DECLARE
query1 TEXT:='';
BEGIN
    query1 := 'SELECT * FROM tt1 UNION ALL SELECT * FROM tt2';      
    RETURN query1;
END;
$BODY$
LANGUAGE PLPGSQL;



CREATE OR REPLACE FUNCTION use_generated_string() RETURNS VOID     AS
$BODY$
DECLARE
BEGIN
       -- Need to modify here to get the result same as below query by 
       -- calling above function.
       -- "SELECT * FROM tt1 UNION ALL SELECT * FROM tt2"
END;
$BODY$
LANGUAGE PLPGSQL;

query_string 函数返回查询字符串。 如何修改“use_generated_string”函数,以便通过调用use_generated_string 函数得到以下查询的结果。

SELECT * FROM tt1 UNION ALL SELECT * FROM tt2;

谁能帮忙?

【问题讨论】:

    标签: sql database postgresql plpgsql


    【解决方案1】:

    如果您声明返回类型(并将调用的 SQL 固定为该类型),您可以这样做:

    CREATE OR REPLACE FUNCTION use_generated_string() RETURNS TABLE( c1 INT, c2 TEXT ) AS
    $BODY$
    DECLARE
    BEGIN
        RETURN QUERY EXECUTE query_string();
    END;
    $BODY$
    LANGUAGE PLPGSQL;
    

    如果返回类型应该保持动态,这是一个微妙的问题,我建议先阅读Erwin Brandstetterexcellentanswers

    klin 的回答通过使用RAISE NOTICE 避免了整个问题,这非常聪明,但我不确定如何使用这种调用的结果,除了手动文本解析。

    【讨论】:

      【解决方案2】:

      使用EXECUTE:

      CREATE OR REPLACE FUNCTION use_generated_string() RETURNS VOID     AS
      $BODY$
      DECLARE
          rec record;
      BEGIN
          FOR rec IN EXECUTE(query_string()) LOOP
              RAISE NOTICE '%', rec.name;
          END LOOP;
      END;
      $BODY$
      LANGUAGE PLPGSQL;
      
      SELECT use_generated_string();
      
      NOTICE:  name1
      NOTICE:  name2
      NOTICE:  name3
      NOTICE:  name4
      NOTICE:  name5
      NOTICE:  name6
       use_generated_string 
      ----------------------
      
      (1 row)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-07
        • 2019-11-26
        • 1970-01-01
        • 2021-12-11
        • 2016-01-29
        • 2012-09-04
        • 2016-12-19
        • 1970-01-01
        相关资源
        最近更新 更多