Recherche Procedures Stockes desesperement

Recherche Procedures Stockes desesperement - SQL/NoSQL - Programmation

Marsh Posté le 17-12-2003 à 09:49:27    

Voila mon probleme est simple j'aimerais savoir comment faire un  
multi INSERT avec une Store Proc:
Ma requete aurais cette forme
INSERT INTO MyTable (Champ Fixe,Variable) values of ('toto',x)
toto etant une valeur constante a inserer pour toutes les requetes (mais passer en parametre a ma store proc c'est un ID) et x etant un ensemble de valeur a associer a mon ID la table aurai cette gueule:
------------------------------------
ID             Avions
1                747
1                737
1                707
1                100  
2                AB6  
2                747
Donc pour resumer je veux envoyer a ma store Proc un ID et un ensemble d'avions (1;747,737,707,100) comment ecrire une telle strore proc?


Message édité par PETOZAK le 17-12-2003 à 09:51:34
Reply

Marsh Posté le 17-12-2003 à 09:49:27   

Reply

Marsh Posté le 17-12-2003 à 10:01:52    

Fo passer par une table temporaire.
Tu la cree et tu la remplis avec tes avions, puis tu appelle ta proc stock, puis tu detruit la table.


---------------
Light is right
Reply

Marsh Posté le 17-12-2003 à 10:20:12    

et ca donne quoi en language Store Proc?
Comment fais tu pour remplir ta table temp avec plusieurs avions?


Message édité par PETOZAK le 17-12-2003 à 10:21:11
Reply

Marsh Posté le 17-12-2003 à 10:37:08    

Alors pour ecrire ta proc stock, ca doit donner un truc comme ca:

Code :
  1. create table ##TMP_avion
  2. (avion integer not null)
  3. create proc nomDeMaProc
  4.   @id integer
  5. as begin
  6.   -- bla bla des verifications
  7.   insert MyTable
  8.          (ChampFixe,
  9.           Variable)
  10.   select @id,
  11.          avion
  12.   from   #TMP_avion
  13. end
  14. drop table ##TMP_avion


 
Ensuite pour l'appeler:

Code :
  1. create table ##TMP_avion
  2. (avion integer not null)
  3. insert ##TMP_avion (avion) values (747)
  4. insert ##TMP_avion (avion) values (737)
  5. insert ##TMP_avion (avion) values (707)
  6. exec nomDeMaProc 123
  7. drop table ##TMP_avion


 
Un truc dans le genre quoi...  :wahoo:


---------------
Light is right
Reply

Marsh Posté le 17-12-2003 à 11:02:42    

Merci

Reply

Marsh Posté le 17-12-2003 à 11:14:28    

la syntaxe des table temporaires ressemble plutôt à ça :

Code :
  1. CREATE GLOBAL TEMPORARY TABLE TEST(name varchar2(20)) on commit delete rows;


(à adapter à ton cas, tel que "delete table" ou table pas globale etc.)
D'autant plus que si la base est bien administrée, l'utilisateur ne pourra pas créer une table normale.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 17-12-2003 à 11:37:36    

Quel sgbd?

Reply

Marsh Posté le 17-12-2003 à 17:54:27    

SQL 2000

Reply

Marsh Posté le 18-12-2003 à 11:22:24    

au fait je voulais plutot une Storeproc qui prennet un ensemble d'avion donc plutot que:
  insert ##TMP_avion (avion) values (747)
  insert ##TMP_avion (avion) values (737)
  insert ##TMP_avion (avion) values (707)
un truc pas mal serait de passer (747,737,707) en une fois  

Reply

Marsh Posté le 18-12-2003 à 12:28:50    

PETOZAK a écrit :

au fait je voulais plutot une Storeproc qui prennet un ensemble d'avion donc plutot que:
  insert ##TMP_avion (avion) values (747)
  insert ##TMP_avion (avion) values (737)
  insert ##TMP_avion (avion) values (707)
un truc pas mal serait de passer (747,737,707) en une fois  


C pas possible....


---------------
Light is right
Reply

Marsh Posté le 18-12-2003 à 12:28:50   

Reply

Marsh Posté le 18-12-2003 à 12:59:44    

tu es sur Nerisson on m'a dit que l'on pouvait passer un tableau a une Store Proc (en Java du moins),qu'en pense tu?


Message édité par PETOZAK le 18-12-2003 à 12:59:57
Reply

Marsh Posté le 18-12-2003 à 14:13:12    

Euh... non je ne crois pas que ca soit possible.
Par contre si tu fait un appel Java a cette procedure, je peut te donner un exemple de code Java pour appeler cet proc avec une table temporaire.


---------------
Light is right
Reply

Marsh Posté le 18-12-2003 à 14:28:26    

ce serait sympas :) merci

Reply

Marsh Posté le 18-12-2003 à 14:31:13    

Exemple:

Code :
  1. public synchronized void ajouteListeUniversReference(final Integer[] idUnivers, final Integer[] idReference, final Integer user) throws SQLException {
  2.     /* Recupere une connexion */
  3.     final Connection connection = getConnection();
  4.     final String tmpTableName = "##TMP_BKT_ajouteListeUniversReference";
  5.     try {
  6.       /* Creation de la table temporaire */
  7.       final String tableCreation = "create table " + tmpTableName + " " +
  8.           "(IdReference integer not null," +
  9.           " IdUnivers   integer not null)";
  10.       final PreparedStatement preparedStatement = connection.prepareStatement(tableCreation);
  11.       try {
  12.         final int nb = preparedStatement.executeUpdate();
  13.       } finally {
  14.         preparedStatement.close();
  15.       }//end try
  16.       /* Remplissage de la table temporaire */
  17.       final Statement statement = connection.createStatement();
  18.       try {
  19.         statement.clearBatch();
  20.         for(int i=0;i<idReference.length;i++) {
  21.           final StringBuffer buffer = new StringBuffer(200);
  22.           buffer.append("insert ##TMP_BKT_ajouteListeUniversReference values(" );
  23.           buffer.append(idReference[i].intValue()).append("," );
  24.           buffer.append(idUnivers[i].intValue()).append(" )" );
  25.           statement.addBatch(buffer.toString());
  26.         }//end for
  27.         statement.executeBatch();
  28.       } finally {
  29.         statement.close();
  30.       }//end try
  31.       /* Prepare l'appel de la procedure */
  32.       final String query = "{?=call BKT_ajouteListeUniversReference;1 ?}";
  33.       final CallableStatement callableStatement = connection.prepareCall(query);
  34.       try {
  35.         /* Parametres de la procedure */
  36.         callableStatement.registerOutParameter(1, java.sql.Types.INTEGER);
  37.         register(callableStatement, user, 2);
  38.         /* Execute la procedure */
  39.         callableStatement.execute();
  40.         /* Recupere le code de retour */
  41.         final int returnValue = callableStatement.getInt(1);
  42.         switch(returnValue) {
  43.           case 0:  // OK
  44.             break;
  45.           case 1:  // Erreur interne
  46.             internalError(query, returnValue);
  47.           case 2:  // Utilisateur inconnu
  48.             unknowUser(query, returnValue, user);
  49.           default: // Code de retour inconnu
  50.             unknowCode(query, returnValue);
  51.         }//end switch
  52.       } finally {
  53.         callableStatement.close();
  54.       }//end try
  55.     } finally {
  56.       dropTable(connection, tmpTableName);
  57.       unlockConnection(connection);
  58.     }//end try
  59.   }//end ajouteListeUniversReference


Ca ne compilera pas car il manque des methodes, mais je pense que tu pourra sans probleme les remplacer  :)


---------------
Light is right
Reply

Marsh Posté le 18-12-2003 à 14:55:13    

Je viens d'avoir une idee en lisant ton code:
je peux creer un batch qui ferait:
1)effacer la liste de Aircrafts associes a un ID passer en param du delete
2)executer les INSERTs
C'est possible?
un batch avec un sous batch delete et autant de sous batch INSERT qu'il y a de Aircrafts a ajouter?

Reply

Marsh Posté le 18-12-2003 à 15:22:30    

Tu parles de batch JDBC ?
Si oui, un batch JDBC est fait pour envoyer un grand nombre de requetes au SGBD donc tu peut tres bien encapsuler tout ca dans une methode Java.


---------------
Light is right
Reply

Marsh Posté le 18-12-2003 à 15:26:16    

Mais c'est Zuper :) j'apprend un truc pas mal merci !

Reply

Marsh Posté le 18-12-2003 à 15:26:33    

C'est en plus je pense plus adapte a ce que je fais non?

Reply

Sujets relatifs:

Leave a Replay

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