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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了执行存储在bytea列中的解码功能相关的知识,希望对你有一定的参考价值。

我在一个包含函数解码()的表中有一个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应用程序中使用此查询。

谢谢!

答案

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

以上是关于执行存储在bytea列中的解码功能的主要内容,如果未能解决你的问题,请参考以下文章

将 Java UUID 存储在二进制数据库列中,Hibernate/JPA 与原始 JDBC

应用执行相同的查询从数据库获取bytea类型的数据获取结果不一致

应用执行相同的查询从数据库获取bytea类型的数据获取结果不一致

Spring 数据存储库将 null 作为 bytea 发送到 PostgreSQL 数据库

在 Java 中创建一个 bytea 数组以传递给 Postgresql 存储过程

PL/SQL:如何运行存储在表列中的sql语句来获取sql语句的执行时间?