Re: Copying Blobs between two tables using Insert stmt - [SOLUTION]

From: "John Skillings" <jskillings07(at)gmail(dot)com>
To: pgsql-general(at)postgresql(dot)org
Subject: Re: Copying Blobs between two tables using Insert stmt - [SOLUTION]
Date: 2008-10-17 22:36:01
Message-ID: caad18b00810171536l2734231oee0184680c27b881@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Hi all,

Here is the solution I ended up in using to solve the problem.

a. Created a copy_blob function.

CREATE OR REPLACE FUNCTION copy_blob(p_blobId OID)
RETURNS OID AS $$
DECLARE
v_NewOID OID;
BEGIN
SELECT lo_create(-1) INTO v_NewOID;

delete from pg_largeobject where loid = v_NewOID;

INSERT INTO pg_largeobject (loid, pageno, data)
SELECT v_NewOID, pageno, data
FROM pg_largeobject
WHERE loid = p_blobId;

RETURN v_NewOID;
END;
$$ LANGUAGE plpgsql;

2. selected the OID from table_a;

3. select copy_blob(OID from table_a);

4. insert into table_b
(
id,
filename)
values
(
nextval('table_b_id_seq'),
v_NewOID
);

Works well so far.

John

On Fri, Oct 17, 2008 at 1:37 PM, John Skillings <jskillings07(at)gmail(dot)com>wrote:

> Hi Diogo,
>
> Thanks for your response. However, my requirement is to have two separate
> copies. Think about table_a being the original copy, and table_b holding
> the backup copy.
>
> Inserting the OID from table_a to table_b will not make the backup copy.
>
> Best Regards,
>
> John
>
>
>
> On Fri, Oct 17, 2008 at 12:32 PM, Diogo Biazus <diogob(at)gmail(dot)com> wrote:
>
>>
>> Em 17/10/2008, às 18:18, John Skillings escreveu:
>>
>>
>> Hi all,
>>>
>>> I am trying to copy blobs between two tables and need help on the best
>>> way to get this done. My requirement is that the both the tables maintain
>>> their own copy of the large object, instead of sharing the OID.
>>>
>>> I created two tables:
>>>
>>> create table table_a
>>> (id bigserial not null,
>>> filename oid);
>>>
>>> create table table_b
>>> (id bigserial not null,
>>> filename oid);
>>>
>>> In one of the tables, I uploaded a file from the filesystem.
>>>
>>> INSERT INTO table_a (id, filename)
>>> VALUES ( nextval('table_a_id_seq'),
>>> lo_import('C:/applications/largeobj.zip'));
>>>
>>> The record is inserted, and I verified the record's integrity by:
>>>
>>> SELECT lo_export(filename, 'C:/applications/largeobj.zip_copy.zip') FROM
>>> table_a;
>>>
>>> Question
>>> ----------------
>>> Now to make a copy of the object from table to table_a to table_a.
>>> Currently I am exporting the file from table_a to the file system, and again
>>> doing an import into table_b. However, in a large application, I find this
>>> workaround not practical because of the volume of the records, and also the
>>> size of the file (binary object). My ideal solution to do an insert of the
>>> values from table_a into table_b directly.
>>>
>>> So, what is best way to create a copy of this LOB from table_a to
>>> table_b?
>>>
>>
>> You can copy only the oid, You don't need to have another copy of the same
>> file in the database, if you copy only the oid you'll have another reference
>> to the same file.
>>
>> So a simple
>> INSERT INTO table_a SELECT * FROM table_b;
>> will do the trick in your example.
>>
>> --
>> Diogo Biazus
>> diogob(at)gmail(dot)com
>> http://www.softa.com.br
>> http://www.postgresql.org.br
>>
>>
>

Browse pgsql-general by date

  From Date Subject
Next Message Scott Marlowe 2008-10-17 22:53:51 Re: ideal server
Previous Message Martin Gainty 2008-10-17 22:31:48 Re: ideal server