PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 Migration » GraceTHD PostgreSQL export_SHP-CSV Out BAT » 09/07/2024 17:12:24

philippe_schitter
Réponses : 0

Bonjour à Toutes et à Tous,

Je travaille sur les bases de données SIG Télécom et plus précisément sur le Modèle Conceptuel de Données GraceTHD
dont les tables sont hébergées sous le SGBDR PostgreSQL (avec l'extension PostGIS).

Ma recherche est un code Batch pour exporter automatiquement toutes les tables sous PostgreSQL vers un ensemble de fichiers
aux formats : SHP/CSV : Shapefile (tables avec géométrie) / CSV (tables sans géométrie).

Sur le site de GraceTHD, un dossier de fichiers *.BAT avec des paramètres par défaut est mis à disposition pour cela : [https://github.com/GraceTHD-community/GraceTHD.git]

mais il est rédigé pour des bases de données hébergées en local (Host name/address : localhost).
De mon côté, je cherche à modifier l'adresse du Hostname, le nom du schéma, voire ajouter un deuxième schéma et des tables et vues supplémentaires à exporter.
J'ai commencer à modifier les différents fichiers *.BAT que je suppose concernés et liés entre eux mais lorsque je clique sur le fichier qui lance l'export : "gracethd_pg_export_shpcsv-out.bat" ==> rien ne se lance.

Voici 4 impressions-écran ci-dessous (4 liens à cliquer) pour illustrer mon message. Les flèches rouges indiquent les différents *.BAT dont j'ai modifié les paramètres.

Je vous remercie par avance pour toute aide que vous pourriez m'apporter.

Philippe

[https://drive.google.com/file/d/1_4Uy7r … sp=sharing]

[https://drive.google.com/file/d/1SrUqjr … sp=sharing]

[https://drive.google.com/file/d/18_aUgL … sp=sharing]

[https://drive.google.com/file/d/1sT0mli … sp=sharing]

#2 Re : PL/pgSQL » Division/split d'1 table en x tables, fct de x val uniques d' 1 champ » 29/07/2022 13:55:26

Merci beaucoup rjuju/Julien pour toutes ces informations et surtout pour m'avoir débloqué au début de l'ensemble de cette discussion avec le "RETURN void".
Bien cordialement,
Philippe

#3 Re : PL/pgSQL » Division/split d'1 table en x tables, fct de x val uniques d' 1 champ » 29/07/2022 09:59:55

Merci rjuju pour ces informations : pg_upgrade
Je vais tester cela. C'est bien dans l'invite de commande de Windows qu'on lance ce code directement ?

--

Du coup, comme vous m'y avez incité, je vais "mentir" une fois suite à mon dernier message.

J'ai encore une question : la notion de séquence ?
j'ai cru comprendre qu'elle était utilisée pour incrémenter des ID (clé primaires par exemple)
mais je n'ai jamais eu besoin de les utiliser. PostgreSQL les crée automatiquement ?
Sur certaine grosses requête SQL qui génèrent la création d'une base (Tables et Champs selon un MCD comme dans les télécom : GraceTHD, Syane ou encore Covage) puis l'insertion des données, il y a des séquences rédigées
mais je ne sais pas à partir de quel moment/quelles conditions cette rédaction de séquences devient indispensable ?

Merci rjuju (en Julien, j'ai cru comprendre) par avance pour vos informations.

#4 Re : PL/pgSQL » Division/split d'1 table en x tables, fct de x val uniques d' 1 champ » 28/07/2022 20:40:46

Merci beaucoup rjuju pour toutes vos informations !

Ah, une toute toute dernière question et je ne vous embête plus : j'utilise en local depuis 2019 et pour des migrations des bases de données SIG télécom du MCD Covage vers le MCD GraceTHD
le SGBDR PostgreSQL version 9.5/pgAdmin III . J'ai 63 bases de données dessus.
J'ai récemment installé les versions 13.7 et 14.4/pdAdmin 4 sur le poste de nouveaux collègues.
==> Pour installer la dernière (14.4), je dois supprimer la 9.5 et exporter préalablement un backup pour chacune des 63 bases de données ?

Merci beaucoup par avance (j'essayerai de ne plus vous retenir davantage)

Bien cordialement.

Philippe

#5 Re : PL/pgSQL » Division/split d'1 table en x tables, fct de x val uniques d' 1 champ » 28/07/2022 17:56:54

Re-Bonjour,

Merci beaucoup rjuju pour votre aide avec notamment "RETURN void".
J'ai réussi à créer automatiquement mes x (ici : 3 dans mon exemple : "ARERIEN", "IMMEUBLE" et "SOUTERRAIN") tables issues de la division y compris avec la création en boucle des Contraintes de clés primaires.

Le code est le suivant :

"""

DROP FUNCTION IF EXISTS syane_test.split_CB();

CREATE FUNCTION syane_test.split_CB() RETURNS void as $$
DECLARE
        x VARCHAR;
BEGIN
        FOR x IN SELECT DISTINCT CB."mode_pose"
               FROM "syane_test"."CB" CB
               LOOP
 
      EXECUTE format('
      DROP TABLE IF EXISTS syane_test.CB_'||x||';
                     
                     
      CREATE TABLE syane_test.CB_'||x||' AS
      SELECT *
      FROM "syane_test"."CB" CB
      WHERE CB."mode_pose" ='||quote_literal(x)||';');
 
      EXECUTE format('ALTER TABLE syane_test.CB_'||x||'
      ADD CONSTRAINT '||x||'_pkey PRIMARY KEY("code_cb")');
     

        END LOOP;

END;
$$ LANGUAGE plpgsql;

SELECT syane_test.split_CB();

"""

Division/Split d'une Table en PL/pgSQL

@rjuju : étant encore débutant sur le PL/pgSQL, j'ai  trois petites questions complémentaires à titre informatif.
-1- Quand et pourquoi utilise-t-on l'instruction : EXECUTE format('requête SQL') ?
-2- Quand et pourquoi utilise-t-on la fonction : quote_literal() ?
      Appliquée à la variable x dans mon exemple mais uniquement au sein de la clause WHERE et à l'intérieur de l'instruction EXECUTE format('requête SQL').
-3- À quoi correspond le type de variable "void" ?

Merci rjuju par avance pour vos précisions complémentaires et surtout surtout pour le "RETURN void" qui m'a débloqué.

Bien Cordialement.

#6 PL/pgSQL » Division/split d'1 table en x tables, fct de x val uniques d' 1 champ » 28/07/2022 09:10:33

philippe_schitter
Réponses : 8

Bonjour,

Je travaille dans les télécom et je souhaite diviser une table de câbles "CB" en x tables en fonction des x valeurs uniques du champ "mode_pose".
Après consultation des tutoriels et forums, j'ai rédigé en PL/pgSQL le code copié ci-dessous :

"""

CREATE OR REPLACE FUNCTION split_CB() RETURNS VARCHAR as $$
DECLARE
        x VARCHAR;
BEGIN
        FOR x IN SELECT DISTINCT CB."mode_pose"
               FROM "syane_test"."CB" CB
               LOOP
 
      EXECUTE format('
      DROP TABLE IF EXISTS syane_test.CB_'||x||';
                     
                     
      CREATE TABLE syane_test.CB_'||x||' AS
      SELECT *
      FROM "syane_test"."CB" CB
      WHERE CB."mode_pose" ='||quote_literal(x)||';');
 
        END LOOP;

END;
$$ LANGUAGE plpgsql;

SELECT split_CB();

"""

et je me suis heurté à un message d'erreur suivant :

"""

NOTICE:  la table « cb_aerien » n'existe pas, poursuite du traitement
CONTEXT:  instruction SQL «
      DROP TABLE IF EXISTS syane_test.CB_AERIEN;
                     
                     
      CREATE TABLE syane_test.CB_AERIEN AS
      SELECT *
      FROM "syane_test"."CB" CB
      WHERE CB."mode_pose" ='AERIEN'; »
fonction PL/pgsql split_cb(), ligne 9 à EXECUTE
NOTICE:  la table « cb_immeuble » n'existe pas, poursuite du traitement
CONTEXT:  instruction SQL «
      DROP TABLE IF EXISTS syane_test.CB_IMMEUBLE;
                     
                     
      CREATE TABLE syane_test.CB_IMMEUBLE AS
      SELECT *
      FROM "syane_test"."CB" CB
      WHERE CB."mode_pose" ='IMMEUBLE'; »
fonction PL/pgsql split_cb(), ligne 9 à EXECUTE
NOTICE:  la table « cb_souterrain » n'existe pas, poursuite du traitement
CONTEXT:  instruction SQL «
      DROP TABLE IF EXISTS syane_test.CB_SOUTERRAIN;
                     
                     
      CREATE TABLE syane_test.CB_SOUTERRAIN AS
      SELECT *
      FROM "syane_test"."CB" CB
      WHERE CB."mode_pose" ='SOUTERRAIN'; »
fonction PL/pgsql split_cb(), ligne 9 à EXECUTE
ERREUR:  le contrôle a atteint la fin de la fonction sans RETURN
CONTEXT:  fonction PL/pgsql split_cb()
********** Erreur **********

ERREUR: le contrôle a atteint la fin de la fonction sans RETURN
État SQL :2F005
Contexte : fonction PL/pgsql split_cb()


"""

Pouvez-vous m'aider à résoudre cette erreur ?
Et si oui, dans la foulée, est-il possible d'intégrer aux nouvelles tables, la création en boucle de Contraintes de clé primaire ?

Merci par avance.
Bien cordialement.

Pied de page des forums

Propulsé par FluxBB