亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

重構PL/pgSQL函數以返回各種SELECT查詢的輸出

重構PL/pgSQL函數以返回各種SELECT查詢的輸出

喵喔喔 2019-06-13 14:52:08
重構PL/pgSQL函數以返回各種SELECT查詢的輸出我編寫了一個輸出PostgreSQL的函數SELECT查詢格式良好的文本形式?,F在我不想輸出文本了,但實際上運行生成的SELECT語句并返回結果-就像查詢本身一樣。到目前為止我所擁有的是:CREATE OR REPLACE FUNCTION data_of(integer)   RETURNS text AS$BODY$DECLARE    sensors varchar(100);   -- holds list of column names    type    varchar(100);   -- holds name of table    result  text;           -- holds SQL query        -- declare more variablesBEGIN       -- do some crazy stuff       result := 'SELECT\r\nDatahora,' || sensors ||       '\r\n\r\nFROM\r\n' || type ||       '\r\n\r\nWHERE\r\id=' || $1 ||'\r\n\r\nORDER BY Datahora;';       RETURN result;END;$BODY$LANGUAGE 'plpgsql' VOLATILE;ALTER FUNCTION data_of(integer) OWNER TO postgres;sensors保存表的列名列表。type..這些都是在職能過程中申報和填寫的。最終,他們持有的價值觀如下:sensors: 'column1, column2, column3'除了Datahora (timestamp)所有列都是類型的double precision.type :'myTable'可以是四個表之一的名稱。每個列都有不同的列,但公共列除外。Datahora.底層表的定義.變量sensors將舉行全中相應表的列顯示在此處。type..例如:如果type是pcdmet然后sensors將是'datahora,dirvento,precipitacao,pressaoatm,radsolacum,tempar,umidrel,velvento'變量用于構建SELECT中存儲的語句。result..比如:SELECT Datahora, column1, column2, column3FROM   myTableWHERE  id=20ORDER  BY Datahora;現在,我的函數返回以下語句text..我復制粘貼并在pgAdmin或psql中執行。我想自動化這一點,自動運行查詢并返回結果。我怎么能這么做?
查看完整描述

3 回答

?
躍然一笑

TA貢獻1826條經驗 獲得超6個贊

您可能希望返回一個光標..試試這樣的東西(我還沒試過):

CREATE OR REPLACE FUNCTION data_of(integer)
  RETURNS refcursor AS$BODY$DECLARE
      --Declaring variables
      ref refcursor;BEGIN
      -- make sure `sensors`, `type`, $1 variable has valid value
      OPEN ref FOR 'SELECT Datahora,' || sensors ||
      ' FROM ' || type ||
      ' WHERE nomepcd=' || $1 ||' ORDER BY Datahora;';
      RETURN ref;END;$BODY$LANGUAGE 'plpgsql' VOLATILE;ALTER FUNCTION data_of(integer) OWNER TO postgres;


查看完整回答
反對 回復 2019-06-13
?
肥皂起泡泡

TA貢獻1829條經驗 獲得超6個贊

我很抱歉地說,你的問題很不清楚。但是,下面將找到一個自包含的示例,說明如何創建和使用返回游標變量的函數。希望能幫上忙!

begin;create table test (id serial, data1 text, data2 text);insert into test(data1, data2) values('one', 'un');
insert into test(data1, data2) values('two', 'deux');insert into test(data1, data2) values('three', 'trois');
create function generate_query(query_name refcursor, columns text[])returns refcursor 
as $$begin
  open query_name for execute 
    'select id, ' || array_to_string(columns, ',') || ' from test order by id';
  return query_name;end;$$ language plpgsql;select generate_query('english', array['data1']);fetch all in english;
  select generate_query('french', array['data2']);fetch all in french;move absolute 0 from french; -- do it again !fetch all in french;
  select generate_query('all_langs', array['data1','data2']);fetch all in all_langs;-
  - this will raise in runtime as there is no data3 column in the test tableselect generate_query('broken', array['data3']);rollback;


查看完整回答
反對 回復 2019-06-13
  • 3 回答
  • 0 關注
  • 1797 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號