簡體   English   中英

PostgreSQL 存儲過程,如何返回結果集

[英]PostgreSQL Stored Procedure, How to Return Result Set

我試圖創建一個將返回結果集的存儲過程。 我使用的是動態查詢,因此它首先通過字符串創建,然后在過程結束時執行。 我只是不知道如何返回 Select 語句的整個結果。

我的查詢有效,因為我已經對其進行了測試(不要介意選擇查詢,它只是一個示例)。 你如何正確地做到這一點? 有人可以幫我嗎?

這是我的存儲過程:

  CREATE or REPLACE FUNCTION getTranscriptData(fromDate text, toDate text, idno integer = 0) 
RETURNS  TABLE(
    id integer,
    employee_id integer,
    employee_name text,
    client_id integer,
    client_name text
) AS -- text AS --
$body$
DECLARE
whereclause TEXT;
fullsql TEXT;
records RECORD;
exeQuery TEXT;

BEGIN

IF idno = 0 THEN
    whereclause := 'WHERE logs.timestamp  - INTERVAL ''12 hours''  >= ''' || fromDate || '''::timestamp ';
    whereclause := whereclause|| ' AND logs.timestamp  - INTERVAL ''12 hours'' <= ''' || toDate || '''::timestamp';
ELSE
    whereclause := ' WHERE trans.trans_id IN (1,2,3) ';
END IF;

--RAISE NOTICE 'Whereclause = "%"', whereclause;


fullsql:= 'SELECT
        trans.trans_id AS id, agent.account_id AS agent_id, agent.lastname || '', '' || agent.firstname AS agent_name, 
        client.account_id AS client_id, client.lastname || '', '' || client.firstname AS client_name
      FROM chat_transcript_archive trans
      INNER JOIN Client_session_archive csession ON csession.client_session_id = trans.client_session_id
      INNER JOIN client_queue_archive clientq ON clientq.Client_queue_id = trans.Client_queue_id
      INNER JOIN agent_session_archive asession ON asession.agent_session_id = trans.agent_session_id
      INNER JOIN agent_queue_archive agentq ON agentq.agent_queue_id = trans.agent_queue_id
      INNER JOIN accounts client ON client.account_id = csession.client_id
' || whereclause || '

      GROUP BY trans.trans_id, agent.account_id, agent.lastname, agent.firstname, client.account_id, client.lastname, client.firstname

      ORDER BY 13';

RAISE NOTICE 'FULL Query = "%"', fullsql;

exeQuery := 'SELECT * FROM (' || fullsql || ') AS records'

RETURN QUERY EXECUTE exeQuery;

END
$body$
LANGUAGE plpgsql;

正如您發現的那樣,您錯過了一個分號。

然而,你顯然讓事情對自己來說太復雜了。 刪除整行並執行以下操作:

RETURN QUERY fullsql;

應該更優雅地完成這個技巧。 把它變成內聯視圖只是為了給它一個別名,你什么也得不到。

對不起各位。 我能夠解決這個問題。 問題是這一行沒有分號

 exeQuery := 'SELECT * FROM (' || fullsql || ') AS records'

我覺得很愚蠢。 無論如何,在這里幫助那些對存儲過程有疑問的人。

暫無
暫無

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

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