执行存储在 bytea 列中的解码函数

Execute decode function stored in bytea column

我在 table 中有一个包含函数 decode() 的 bytea 列。我做了什么得到实际数据如下:

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

只要我必须 select 一行,以上就可以了。但是现在我的要求是得到不止一个结果。如何在单个查询中获得结果?我试过使用 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 )
INTO _result;

END;
$x$
LANGUAGE plpgsql;

但这只适用于单行单列。我想要的是一个查询来获取 2 列,如果可能的话不使用 pl/pgsql。我在基于 Java 的网络应用程序中使用此查询。

谢谢!

您需要为此编写过程代码,因为 SQL 中没有提供动态语句。

以下函数转换所有附件:

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;$$;

这就是我编写函数的方式,几乎没有改动

CREATE OR REPLACE FUNCTION getmeall(tName text, fNameCol text, dataCol text,fSize 
numeric) 
 RETURNS TABLE(bdata bytea, fname text) LANGUAGE plpgsql AS
 $$DECLARE
  v_stmt text;
  v_name text;

 BEGIN
  FOR v_stmt,v_name IN
   EXECUTE format('SELECT encode(%s, ''escape''), %s FROM   %s
    WHERE   IS NOT NULL AND  IS NOT NULL LIMIT '
    , dataCol, fNameCol, tName)
    USING  dataCol, fNameCol, fSize
  LOOP
    fname:=v_name;
    IF strpos(v_stmt,'decode') = 1 THEN
        EXECUTE 'SELECT ' || v_stmt INTO bdata;
    ELSE
        bdata:=v_stmt;
    END IF;
    RETURN NEXT;
  END LOOP;
END;$$;

最后这样称呼它。

select * from getmeall('attachments', '"filename"', '"data"',2)