执行存储在bytea列中的解码功能

我在一个表中有一个bytea列,其中包含一个函数decode()。我为获取实际数据所做的工作如下:

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

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

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

谢谢!

brqtmars 回答:执行存储在bytea列中的解码功能

为此您需要过程代码,因为在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  $1 IS NOT NULL AND $2 IS NOT NULL LIMIT $3',dataCol,fNameCol,tName)
    USING  dataCol,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)

本文链接:https://www.f2er.com/3147279.html

大家都在问