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

问题描述 投票:0回答:2

我在一个包含函数解码()的表中有一个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

上面的代码很好,只要我必须选择一行。但是现在我的要求是要获得不止一个结果。如何在单个查询中得到结果?我尝试使用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应用程序中使用此查询。

谢谢!

postgresql plpgsql postgresql-9.6
2个回答
0
投票

您需要为此使用过程代码,因为在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;$$;

0
投票

这就是我编写函数时所做的很少改动

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, 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)

© www.soinside.com 2019 - 2024. All rights reserved.