Refactor a PL/pgSQL function to return the output of various SELECT queries

后端 未结 4 1266
执笔经年
执笔经年 2020-11-22 00:05

I wrote a function that outputs a PostgreSQL SELECT query well formed in text form. Now I don\'t want to output a text anymore, but actually run the generated <

4条回答
  •  难免孤独
    2020-11-22 00:20

    I'm sorry to say but your question is very unclear. However below you'll find a self contained example how to create and use a function that returns a cursor variable. Hope it helps !

    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 table
    select generate_query('broken', array['data3']);
    
    rollback;
    

提交回复
热议问题