Newsgroup: it.comp.java
Titolo: Domanda al volo.

Come fare in java per eseguire un sql su db mysqk che contenga diverse 
istruzioni?
Nello specifico devo poter lanciare una sorta di script che mi crei una 
tabella e me la popoli con una serie di record, ma mentre la create mi 
funziona, al primo insert mi da "syntax error near .."
Ho provato ad eseguire il comando sia con execute che con executeBatch, 
ma nulla.
Dove sbaglio?
Lo script e' questo, ma vorrei poter far in modo che venga eseguita una 
qualsiasi sequenza di istruzioni sql indipendentemente da quante esse 
siano e dalla loro natura
DROP TABLE IF EXISTS `rivenditori`;
CREATE TABLE `rivenditori` (
   `id` varchar(255) NOT NULL default '',
   `ragione_sociale` varchar(255) default NULL,
   `licenza` varchar(255) NOT NULL default '',
   `ultimo_accesso` timestamp NULL default NULL,
   PRIMARY KEY  (`id`,`licenza`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC;
INSERT INTO `rivenditori` VALUES ('101010','aaa','blabla',NULL);
INSERT INTO `rivenditori` VALUES ('101010','aaa','bbbb',NULL);
INSERT INTO `rivenditori` VALUES ('333','ccc','333-223',NULL);
INSERT INTO `rivenditori` VALUES ('partita','ragiones','s',NULL);

 ha scritto nel messaggio
news:d3g6b1$mtl$1...@area.cu.mi.it...


O, magari, una bella stored procedure....
Scorpio.

 
Il punto e' che devo prevedere una procedura di "live update" di un 
database remoto. non posso fare una connessione diretta alla porta 3306 
di mysql, posso solo prevedere di inviare al sistema remoto un file 
contenente tutte le istruzioni necessarie alla creazione/aggiornamento 
della/e tabella/e.
Ovviamente mi viene infinitamente piu' comodo prevedere un unico file 
contenente l'update di tutta la struttura anziche' doverne spedire enne, 
ciascuno con una singola query (Se devo inserire 400 record, ti lascio 
immaginare la seccatura di preparare 400 singole insert).
Se davvero non e' possibile usare gli jdbc per simili attivita' (grossa 
delusione! caspita, e' un'attivita' consueta quella di popolare un 
database, o di modificarne la struttura per correggere dei bugs o 
implementare nuove funzionalita'), credo che dovro' ricorrere ad una 
gabola: passare il file con l'intera sequenza di comandi a java, il 
quale eseguira' una exec del comando "mysql" con parametro il nome del 
file contenente la query.
Certo, se fosse possibile, eviterei questa strada.

> O, magari, una bella stored procedure....
  Quale parte di "mysql" non hai capito?

> Certo, se fosse possibile, eviterei questa strada.
Ce ne sono altre infatti...
Se il tuo problema e' quello di non voler scrivere n file diversi, puoi 
comunque usare n query, usando l'oggetto StringTokenizer (Si scrive 
cosi???) In pratica fai n pezzetti del tuo file ed ogni pezzetto (query 
singola) termina con un bel ";" o un'altro carattere o sequenza che ti 
piace, vedi tu.
Infine esegui le query una per volta.
La #2 soluzione e' che ti scrivi uno script e lo esegui come tale.
Come si fa ad eseguire uno script mysql??? Boooo....
Con Oracle, quando devo eseguire una SP racchiudo il nome ed i parametri 
dello statement tra begin ed end o qualcosa di simile.
[CUT]
   CallableStatement callableStatement =
       con.prepareCall("Begin " + nameProcFunc + "; End;");
[CUT]
Penso che tu debba fare circa lo stesso. Vai nella documentazione di 
mysql e vedi come fare a richiamare una sp, ma non da jdbc, direttamente 
dai suoi strumenti. Probabilmente lo spiega.
Poi ti impacchetti una superstringona  (con StringBuffer, mi raccomando) 
e la spari a mysql, esattamente come fosse una query.
L'unico problema che potresti avere e' nella dimensione del buffer.
Con Oracle, infatti, non posso dare una stringa piu' grande di 2000 
caratteri, in alcune circostanze. Non so se in MySql e' uguale. In tal 
caso, fai un ibrido tra le due soluzioni. StringTockenizer, sommi fino 
alla dimensione del buffer, esegui e ricominci finche' non hai finito...
Saluti,
-- 
            Davide Gurgone
      web: 
http://www.gurgone.it/
mail: davidechiocciolinagurgonepuntoit

 INSERT INTO `rivenditori` VALUES ('partita','ragiones','s',NULL);
E se le scrivessi
INSERT INTO 'rivenditori'
('id','ragione_sociale','licenza','ultimo_accesso')
VALUES (come prima)?
Aggiungo che io non conosco il SQL di MySql ma, nè in DB2 nè in Access
il nome della tabella e quello dei campi deve essere tra apici.
Ciao