récupérer une liste de séquence avec un select

récupérer une liste de séquence avec un select - SQL/NoSQL - Programmation

Marsh Posté le 26-03-2008 à 19:04:37    

salut, je voudrais pouvoir récupérer une liste de séquences avec un select  
 
SELECT NEXTVAL FOR ma_sequence FROM SYSIBM.SYSDUMMY1 fetch first 100 rows only
 
alors ça ça renvoie un résultat, la table sysdummy1 c'est léquivalent de la table dual de oracle
 
donc je le fais avec une autre table systeme à db2, et ça marche, mais je me demande si il y a pas un table équivalente à DUAL mais infinie par exemple donc la seule limite serait le fetch first X rows only

Reply

Marsh Posté le 26-03-2008 à 19:04:37   

Reply

Marsh Posté le 28-03-2008 à 02:44:25    

n'importe laquelle de tes tables à toi qui contient beaucoup des lignes [:spamafote]

Reply

Marsh Posté le 28-03-2008 à 10:04:15    

ouais, mais c'est pas 100% fiable [:spamafote]

 

sinon la solution c'était de récupérer les séquences avec le select qui servais à ramener les lignes à insérer par la suite, j'aidais un collègue qu'était pas très réveillé, dixit lui même :o


Message édité par basketor63 le 28-03-2008 à 10:06:09
Reply

Marsh Posté le 28-03-2008 à 11:16:33    

en db2 je ne sais mais il doit y avoir moyen de s'insipirer de la méthode via connect by d'oracle
 

Code :
  1. select rn
  2. from
  3. (select rownum rn
  4. from dual connect by rownum<=10)

Reply

Marsh Posté le 28-03-2008 à 11:47:46    

casimimir a écrit :

en db2 je ne sais mais il doit y avoir moyen de s'insipirer de la méthode via connect by d'oracle
 

Code :
  1. select rn
  2. from
  3. (select rownum rn
  4. from dual connect by rownum<=10)



 
ok en récursif sans doute
il y a moyen mais il faut deux select et union all, c'est pas aussi clair que dans oracle comme souvent dans db2 :/
 
d'ailleurs pour les rowids sous db2
 

Citation :

To use a Rowid in DB2, a column must be created on a table using the Rowid datatype.


 
encore un truc lourd ...

Reply

Marsh Posté le 28-03-2008 à 15:55:07    

basketor63 a écrit :

salut, je voudrais pouvoir récupérer une liste de séquences avec un select  
SELECT NEXTVAL FOR ma_sequence FROM SYSIBM.SYSDUMMY1 fetch first 100 rows only


 
Petite proposition pour retourner 100 valeurs de séquences :
 

Code :
  1. WITH COMPTEUR(ITERATION)
  2. AS
  3. (
  4. SELECT 1
  5. FROM SYSIBM.SYSDUMMY1
  6. UNION ALL
  7. SELECT ITERATION + 1
  8. FROM COMPTEUR
  9. WHERE ITERATION < 100
  10. )
  11. SELECT NEXTVAL FOR ma_sequence
  12. FROM COMPTEUR;


 
Il faut générer une suite de 1 à n (100 dans cet exemple) en mode récursif (DB2 génère automatiquement une table TEMP).
 
Certes ce n'est pas super intuitif, c'est du DB2, c'est comme le TRUNCATE sous Oracle qui devient un vulgaire "ALTER TABLE xxx ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE" sous DB2 :pt1cable:


---------------
Today has been a fucked up day...
Reply

Marsh Posté le 28-03-2008 à 17:16:26    

laul, bien joué, j'ai pas eu le courage de le faire d'ailleurs [:rofl]

 

et sinon la methode recursive made in db2, je m'en servais pour rétablir l'intégrité des tables apres une desactivation d'intégritée
car ça mettais toutes les tables dépendantes par contraintes en mode "check pending"

 
Code :
  1. SET INTEGRITY FOR UNE_TABLE OFF@
  2. BLABLABLA
  3. COMMIT@
  4. create procedure maj_integrite_dep_PCOSOC ( )
  5. integrite_proc: begin
  6. declare listeTable VARCHAR(5000);
  7. declare req VARCHAR(5000);
  8. set listeTable = '';
  9. for table_row as
  10.  cur cursor with hold for
  11.   WITH n(id) AS
  12.          (   
  13.    SELECT reftabname
  14.    FROM  syscat.references
  15.    WHERE reftabname = 'UNE_TABLE'
  16.    UNION ALL
  17.      SELECT nplus1.tabname
  18.    FROM syscat.references as nplus1, n
  19.    WHERE n.id = nplus1.reftabname
  20.   )
  21.   SELECT distinct id FROM n where id !='UNE_TABLE'
  22. do
  23.  set listeTable = listeTable || table_row.id || ',';
  24. end for;
  25. set req = 'SET INTEGRITY FOR UNE_TABLE IMMEDIATE CHECKED FORCE GENERATED';
  26. prepare s0 from req;
  27. execute s0;
  28. if (length(listeTable) > 0) then
  29.  set listeTable = left(listeTable, length(listeTable)-1);
  30.  set req = 'SET INTEGRITY FOR ' || listeTable || ' IMMEDIATE CHECKED';
  31.  prepare s1 from req;
  32.  execute s1;
  33. end if;
  34. commit;
  35. end integrite_proc@
 

et encore j'ai pas poussé jusqu'a metre la table en question en parametre ...


Message édité par basketor63 le 28-03-2008 à 17:21:39
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed