执行存储在 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)
我在 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)