Search code examples
postgresqlplpgsqlpostgresql-9.6

Execute decode function stored in bytea column


I have a bytea column in a table that contains a function decode(). What I have done to get the actual data is as follows:

select filename, convert_from(data,'UTF-8') from attachments limit 20; //this returns me decode function
select decode(E'...','hex'); // I am executing the above returned function

The above is fine as long as I have to select one row. But now my requirement is to get more than one result. How can I get the result in single query? I have tried using pl/pgsql

CREATE OR REPLACE FUNCTION get_data(integer, _type anyelement, OUT _result anyelement)
  AS
$x$
BEGIN

EXECUTE
'SELECT ' || (select convert_from(data,'UTF-8') as data from attachments limit $1)
INTO _result;

END;
$x$
LANGUAGE plpgsql;

But this works only for single row and single column. What I want is a single query to fetch 2 columns without using pl/pgsql if possible. I am using this query from my Java based web app.

Thanks!


Solution

  • You need procedural code for this, since there is no provision for dynamic statements in SQL.

    The following function converts all attachments:

    CREATE FUNCTION getemall(
       IN v_type anyelement,
       OUT v_result anyelement
    ) RETURNS SETOF anyelement
       LANGUAGE plpgsql AS
    $$DECLARE
       v_stmt text;
    BEGIN
       FOR v_stmt IN
          SELECT convert_from(data,'UTF-8')
          FROM attachments
       LOOP
          EXECUTE v_stmt INTO v_result;
          RETURN NEXT;
       END LOOP;
    END;$$;