执行存储在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 数据库