Re: [posgresql bytea]

From: pierre crumeyrolle <pierre(dot)crumeyrolle(at)c-s(dot)fr>
To: Daniel Verite <daniel(at)manitou-mail(dot)org>
Cc: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: [posgresql bytea]
Date: 2014-02-24 13:12:24
Message-ID: 530B4538.1030103@c-s.fr
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

OK merci

Le 24/02/2014 13:10, Daniel Verite a écrit :
> pierre crumeyrolle wrote:
>
>> ok merci mais j'ai un ERROR COPY file signature not recognized avec
>> l'option BINARY
>> copy TABLE_BYTEA from '/NFS/blobextract' BINARY
> Oui le format binaire pour COPY est spécifique, il comprend une entête et une
> fin de fichier. En fait il est plutôt fait pour relire des données
> précédemment écrites avec COPY TO.
> Voir le chapitre Format binaire dans la doc:
> http://docs.postgresql.fr/9.3/sql-copy.html
>
> D'une manière générale le type BYTEA est gérable dans les langages de
> programmation mais pas tellement avec les outils en ligne de commande du
> genre psql.
>
> On peut quand même s'en sortir en passant par un "large object" intermédiaire
> qui lui en revanche a toute l'API nécessaire pour être importé/exporté en
> fichier.
>
> Etape 1 sous psql
>
> \lo_import '/chemin/vers/fichier-binaire'
>
> Ca va sortir un résultat du genre
> lo_import 123456
>
> où 123456 est l'OID référent de l'objet. Garder ce nombre.
>
> Etape 2: créer (une fois pour toutes) une fonction de conversion dont voici
> un exemple fonctionnel:
>
> CREATE FUNCTION lo_to_bytea(oid) RETURNS bytea
> AS $$
> declare
> fd integer;
> sz integer;
> contents bytea;
> begin
> fd = lo_open($1,262144);
> if (fd<0) then
> raise exception 'Failed to open large object %', $1;
> end if;
> sz=lo_lseek(fd,0,2);
>
> perform lo_lseek(fd,0,0);
> contents = loread(fd,sz);
> if (lo_close(fd)!=0) then
> raise exception 'Failed to close large object %', $1;
> end if;
> return contents;
> end;
> $$ LANGUAGE plpgsql;
>
> Etape 3:
>
> INSERT INTO nom_table(nom_colonne_bytea)
> SELECT lo_to_bytea(123456);
>
> où 123456 est biensûr l'OID précédemment importé
>
> Etape 4: supprimer le large object
>
> \lo_unlink 123456
>
> Cordialement,

--
Envoi via la liste pgsql-fr-generale (pgsql-fr-generale(at)postgresql(dot)org)

In response to

Browse pgsql-fr-generale by date

  From Date Subject
Next Message Alain Benard 2014-02-26 12:39:41 Défaire transactions.
Previous Message Daniel Verite 2014-02-24 12:10:58 Re: [posgresql bytea]