簡體   English   中英

動態查詢創建和執行PostgreSQL

[英]Dynamic Query Creation and Execution PostgreSQL

我下面有兩個表和兩個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_genic_string”函數,以便可以通過調用use_generated_string函數獲得以下查詢的結果。

SELECT * FROM tt1 UNION ALL SELECT * FROM tt2;

有人可以幫忙嗎?

如果聲明返回類型(並保持調用的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 Brandstetter出色 答案

klin的答案通過使用RAISE NOTICE (這非常聰明)避免了整個問題,但是我不確定除了手動文本解析之外,如何使用這種調用的結果。

使用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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM