Вопрос по types, postgresql – Преобразование байтового столбца в OID при сохранении значений

2

Я пытаюсь изменитьbytea столбец, чтобы иметь типoid и по-прежнему сохраняют значения.

Я пытался использовать такие запросы, как:

<code>ALTER TABLE mytable ADD COLUMN mycol_tmp oid;
UPDATE mytable SET mycol_tmp = CAST(mycol as oid);
ALTER TABLE mytable DROP COLUMN mycol;
ALTER TABLE mytable RENAME mycol_tmp TO mycol;
</code>

Но это просто дает мне ошибку:

<code>ERROR: cannot cast type bytea to oid
</code>

Есть ли способ добиться того, чего я хочу?

Связанные с:stackoverflow.com/questions/29433041/… Erwin Brandstetter

Ваш Ответ

5   ответов
-1

я успешно использовал процедуру blob_write из блога Грейс Батумбья:http://gbatumbya.wordpress.com/2011/06/.

Error: User Rate Limit Exceeded
4

Блог Грейс Батумбья, in verbis:

The algorithm is pretty simple, get the binary data, if it is null, return null. Else create a large object and in the lowrite function, pass it the binary value, instead of a path to a file.

The code for the procedure is below. Note that the lo_manage package should be installed for this to work.

create or replace function blob_write(lbytea bytea)
   returns oid
   volatile
   language plpgsql as
$f$
   declare
      loid oid;
      lfd integer;
      lsize integer;
begin
   if(lbytea is null) then
      return null;
   end if;

   loid := lo_create(0);
   lfd := lo_open(loid,131072);
   lsize := lowrite(lfd,lbytea);
   perform lo_close(lfd);
   return loid;
end;
$f$;
CREATE CAST (bytea AS oid) WITH FUNCTION blob_write(bytea) AS ASSIGNMENT;

So now the following code works: CREATE TABLE bytea_to_lo ( lo largeObj );

INSERT INTO bytea_to_lo VALUES ( DECODE('00AB','hex'));

Я попробовал это и работает как шарм.

4

которое фактически хранится в системе.pg_largeobject Таблица. С точки зрения хранения, Oid - 4-байтовое целое число. С другой стороны, столбец типа byteais фактическое содержание.

Чтобы переместить байту в большой объект, необходимо создать новый большой объект с помощью файлового API больших объектов: lo_create () для получения нового OID, затем lo_open () в режиме записи, затем запись с помощью lo_write () или lowrite (), а затем lo_close ().

Это не может быть разумно сделано только с помощью актерского состава.

По сути, для выполнения этого преобразования вам потребуется написать фрагмент кода длиной ~ 10 строк на выбранном вами языке (по крайней мере, один, который поддерживает API больших объектов, включая plpgsql).

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Petter
0

что уже поздно, но для любого, кто столкнется с такой же проблемой в будущем.

Я также столкнулся с аналогичной проблемой, когда у меня были старые данные в столбцах текста непосредственно в столбцах, а не в виде OID. И когда я пытался использовать эти данные с обновленным приложением, я тоже получал

Я использовал знания этой темы, чтобы решить эту проблему. Я твердо чувствую, что тот, кто сталкивается с этим вопросом, наверняка хотел бы взглянуть на этоВот

2

Postgres9.4 добавляетвстроенная функция за это:

lo_from_bytea(loid oid, string bytea)

Отзаметки о выпуске:

Add SQL functions to allow [large object reads/writes][12] at arbitrary offsets (Pavel Stehule)

Заolder versions, это более эффективно, чем чтобыл опубликован ранее:

CREATE OR REPLACE FUNCTION blob_write(bytea)
  RETURNS oid AS
$func$
DECLARE
   loid oid := lo_create(0);
   lfd   int := lo_open(loid, 131072);  -- = 2^17 = x2000
   -- symbolic constant defined in the header file libpq/libpq-fs.h
   -- #define   INV_WRITE   0x00020000
BEGIN
   PERFORM lowrite(lfd, $1);
   PERFORM lo_close(lfd);
   RETURN loid;
END
$func$  LANGUAGE plpgsql VOLATILE STRICT;

STRICT Модификатор умнее, чем обрабатывать NULL вручную.

SQL Fiddle.

Больше в этом связанном ответе:

Understanding cast from bytea to oid

Похожие вопросы