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 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

#2 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.

#3 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

#4 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.

#5 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