Выполнить функцию декодирования, хранящуюся в столбце bytea - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть столбец 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;

Но это работает только для одной строки и одного столбца. То, что я хочу, это один запрос для извлечения 2 столбцов без использования pl / pgsql, если это возможно. Я использую этот запрос из моего веб-приложения на Java.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

Так я написал функцию с небольшими изменениями

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)

0 голосов
/ 07 ноября 2019

Для этого вам необходим процедурный код, поскольку в 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;$$;
...