Forum iSeries, hébergé par xdocs400.com

As400, iSeries, i5, System i, une machine qui évolue pour être de plus en plus puissante.

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

Annonce

ATTENTION : Le système anti-spam est à nouveau opérationnel. Nous avons réactivé les inscriptions.

#1 2018-07-04 08:54:20

Florian67
Membre
Lieu : Alsace
Inscription : 2013-04-04
Messages : 180

[Résolu]Mise à jour des ID des tables

Bonjour à tous,

Avant tout je vais poser le contexte. On met en place un environnement de test qui va contenir tous nos fichiers et nos tables.
Actuellement on a rencontré un problème avec nos tables SQL qui retombaient sur le même ID.

Du coup j'ai trouvé l'instruction SQL :
ALTER TABLE MaTable ALTER COLUMN MacolonneID RESTART WITH 445612

Afin de faire de même sur toutes les tables, j'ai déclaré un curseur sur QSYS2/SYSCOLUMNS et je récupère toutes les colonnes avec IS_IDENTITY à YES.
--> fonctionne bien

C'est la partie récupération en dynamique de l'ID qui me bloque. Je dois faire un select max(ID) en dynamique mais je ne peux pas faire de into.
Du genre :
requete = 'SELECT max(' + %trim(LeChamp) + ') + 1 into ValeurID FROM ' + %trim(LaTable);

La partie ALTER TABLE en dynamique fonctionne bien.

Est-ce que quelqu'un a une petite astuce pour faire ça ?

Merci d'avance.
Florian

Dernière modification par Florian67 (2018-07-05 14:50:36)

Hors ligne

#2 2018-07-04 15:27:10

SGS
Membre
Lieu : Paris
Inscription : 2007-01-23
Messages : 403
Site Web

Re : [Résolu]Mise à jour des ID des tables

Bonjour,
Si j'ai bien compris ton problème, dans un cas comme celui ci, tu es obligé de faire un curseur + fetch pour récupérer la valeur
Cdlt


Serge

Hors ligne

#3 2018-07-05 05:54:46

B.Hauser
Membre
Inscription : 2014-11-15
Messages : 50

Re : [Résolu]Mise à jour des ID des tables

SELECT ... INTO n'est pas supporté avec SQL dynamique.
If faut utiliser un curseur (PREPARE, DECLARE, OPEN, FETCH, CLOSE) ou l'instruction VALUES INTO.

[== Indéfini ==]
Requete = Values(SELECT .... ) into ?;
Exec SQL PREPARE DynSQL from :Requete;
Exec SQL EXECUTE DynSQL Using (:YourResult);

D'ailleur pour determiner la valeur de l'identity acutelle ou prochaine, vous pouvez acceder la vue SYSPARTITIONSTAT dans la bibliotheque QSYS2:

[== Indéfini ==]
Select Next_Identity_Value 
from SYSPARTITIONSTAT 
Where  Table_Name = 'YOURTABLE'
      and Table_Schema = 'YOURLIB';

Birgitta

Dernière modification par B.Hauser (2018-07-05 06:07:35)

Hors ligne

#4 2018-07-05 14:49:53

Florian67
Membre
Lieu : Alsace
Inscription : 2013-04-04
Messages : 180

Re : [Résolu]Mise à jour des ID des tables

Merci à tous les deux pour vos solutions.

Pas mal la vue SYSPARTITIONSTAT mais c'est justement parce que cet ID est incorrect qu'il faut que je fasse la mise à jour.

Pour ceux que ça intéresse :

[== Indéfini ==]
**FREE
ctl-opt decedit('0,') option(*nodebugio) datedit(*ymd.) dftactgrp(*no);

//?-------------------------------------------------------------------
//?Variables
//?-------------------------------------------------------------------
dcl-s ValeurID int(10:0);
dcl-s requete char(500);
dcl-s LaTable char(128);
dcl-s LaBib char(128);
dcl-s LeChamp char(128);

// Récupération de tous les ID des bibliothèques de simu
exec sql
   DECLARE curseur SCROLL CURSOR FOR
   SELECT TABLE_NAME, COLUMN_NAME, TABLE_SCHEMA FROM QSYS2/SYSCOLUMNS
   WHERE (TABLE_SCHEMA='SM000B' or TABLE_SCHEMA='SM001B')
   and IS_IDENTITY='YES' for read only;

Exec Sql
  Open curseur;

Exec Sql
  FETCH curseur into :LaTable, :LeChamp, :Labib;

Dow sqlstt = '00000';

   // Récupération de l'ID en dynamique (seulement possible par un curseur....
   requete = 'SELECT max(' + %trim(LeChamp) +
             ') + 1 FROM ' + %trim(Labib) + '.' + %trim(LaTable);
   Exec sql
      PREPARE P1 from :requete;

   Exec SQL
      DECLARE C1 cursor for P1;

   Exec Sql
      Open C1;

   Exec Sql
      Fetch C1 into :ValeurID;

   Exec Sql
      Close C1;

   if valeurID > 1;
      // Affectation  de l'ID en dynamique
      requete = 'ALTER TABLE ' + %trim(Labib) +'.' + %trim(LaTable) +
                ' ALTER COLUMN '+ %trim(LeChamp) + ' RESTART WITH ' + %char(ValeurID);

      Exec SQL PREPARE DynUpdate from :requete;

      Exec SQL EXECUTE DynUpdate;
   Endif;
   // -----------------------------------------------------------------

   Exec Sql
     FETCH curseur into :LaTable, :LeChamp, :Labib;

Enddo;

Exec Sql
   Close Curseur;

// Fin du programme
*inlr = *on; 

Hors ligne

Pied de page des forums