2017-04-07 2 views
0

J'ai un fichier PDF.Comment insérer un pdf dans postgresql (remote db)

Je pourrais insérer le fichier pdf et db est disponible dans le même serveur en utilisant la fonction et la commande ci-dessous.

fonction

create or replace function bytea_import(p_path text, p_result out bytea) 
        language plpgsql as $$ 
declare 
    l_oid oid; 
    r record; 
begin 
    p_result := ''; 
    select lo_import(p_path) into l_oid; 
    for r in (select data 
      from pg_largeobject 
      where loid = l_oid 
      order by pageno) loop 
    p_result = p_result || r.data; 
    end loop; 
    perform lo_unlink(l_oid); 
end;$$; 
commande

:

update jicontentresource set data = bytea_import('/root/Desktop/Avinash/Avinash.pdf') 
where id =245 

Lorsque le fichier est dans le serveur local et, db est disponible dans un autre serveur (à distance)

Si j'essaie de faire pour le serveur à distance , en utilisant la commande ci-dessous

update jicontentresource set data = bytea_import('/root/Desktop/Avinash/Avinash.pdf') where id =245 

il n'est pas en mesure de prendre le fichier de local.

est-il un moyen d'y parvenir?

Répondre

1

Vous ne pourrez pas faire cela avec une fonction PostgreSQL, car cette fonction s'exécute sur le serveur de base de données, alors que le fichier se trouve sur le système de fichiers côté client.

Vous devrez écrire du code dans un langage de programmation côté client et lire et importer le fichier de cette façon. En fonction de l'API que vous utilisez, vous pouvez lire le fichier en mémoire et utiliser INSERT ou UPDATE, ou vous pouvez utiliser la commande SQL COPY ... FROM STDIN.

0

vous pouvez juste local et distant séparé des choses:

create or replace function bytea_import(l_oid int, p_result out bytea) 
        language plpgsql as $$ 
declare 
    l_oid oid; 
    r record; 
begin 
    p_result := ''; 
    for r in (select data 
      from pg_largeobject 
      where loid = l_oid 
      order by pageno) loop 
    p_result = p_result || r.data; 
    end loop; 
    perform lo_unlink(l_oid); 
end;$$; 

puis exécutez côté client:

t=# select lo_import('/tmp/build.start'); 
lo_import 
----------- 
447349949 
(1 row) 
update jicontentresource set data = bytea_import(447349949) 
where id =245 
+0

peut vous pls elobarate avec un exemple ou un lien pour trouver un similaire Par exemple, ma machine locale est Windows et à distance est la machine Linux –

+0

mes exemples sont juste pour une telle configuration. –

+0

J'ai exécuté la fonction côté serveur et côté client quand je cours la requête donnée, il m'a jeté follwong erro fonction bytea_import (integer) n'existe pas LINE 1: mise à jour jicontentresource set data = bytea_import (43945) ^ CONSEIL: Aucune fonction ne correspond aux types de nom et d'argument donnés. Vous devrez peut-être ajouter des conversions de types explicites. ********** Erreur ********** ERREUR: la fonction bytea_import (integer) n'existe pas État SQL: 42883 Indice: Aucune fonction ne correspond au type et au type d'argument donnés . Vous devrez peut-être ajouter des conversions de types explicites. Caractère: 38 –