Ciao Jack,

Il venerdì 2 novembre 2007 13:06:36 Jack © ha scritto:
[....]

Ok ora il problema è chiaro.
Siccome sono una schiappa in sql mi sono andato a vedere un po' di reference 
sul sito di hsqldb:
http://hsqldb.org/doc/guide/ch09.html

Confesso che non è stato semplicissimo, ho dovuto fare un po' di prove, ma 
alla fine credo di aver capito come stanno le cose.

Riepilogando:
a)
HSQLDB è in grado di gestire vari tipi di tabelle:
MEMORY, CACHED, TEMPORARY, TEMP, TEXT

CACHED è il tipo di tabella di default usato in OOoBase. questo tipo di 
tabelle viene poi salvata al'inetrno del file ODB

TEXT è una tabella in formato testo (csv) che viene mantenuta all'esterno del 
file ODB, ma si tratta pur sempre di una vera e propria tabella del database, 
per cui se viene cancellata accidentalmente, all'avvio del database viene 
ricreata (vuota)

b)
quando nella tua macro dai il comando (ho semplificato per fare l'esempio):
sQuery = "SELECT * INTO TEXT ""filecsv"" FROM ""tabella1"""
oRS = oStatement.executeQuery(sQuery)

in effetti, HSQLDB crea una nuova tabella di tipo TEXT e ci riversa i dati che 
risultano dalla query.

A differenza del comando "SELECT <> INTO OUTFILE ..." di MySQL quindi, in 
questo caso non abbiamo un'esportazione di dati ma la creazione di una nuova 
tabella esterna in formato testo-csv che è "linkata" al database.

Infatti, se dopo aver dato il comando di cui sopra aprirai il file ODB potrai 
vedere le la nuova tabella elencata tra le altre (ma con un'icona diversa)

Se non è visibile, dovrebbe essere sufficiente fare:
   menu Visualizza->Aggiorna tabelle

c)
tutto questo premesso, credo di poter dire che il problema da te riscontrato 
non è dovuto ad un malfunzionamento ma ad un uso improprio di una funzionalità 
peculiare offerta da HSQLDB

d)
Ho elaborato una possibile soluzione.
L'idea è questa:

1. Fai la query per creare la tabella (esattamente come fai ora):

oRecordSet = oStatement.executeQuery( _
        "SELECT * INTO TEXT ""mytemptable"" FROM ""tabella1""")

2. A questo punto, il file csv è stato creato e popolato con i dati.
Siccome si tratta di una tabella linkata al database, dovrai copiare o 
appendere il contenuto in un altro file che avrai creato appositamente.

Non ti metto nessun esempio di codice perchè immagino che tu sappia come fare, 
però in caso di dubbi: sine qua non - siamo qua noi (come dicevano al Bar 
Sport ;-)


3. Ora è il momento di fare pulizia:

oStatement.execute("DROP TABLE""mytemptable"" IF EXISTS")

In questo modo il file non è più linkato al database, ma comunque non è stato 
eliminato dal file system, perciò dovrai farlo manualmente, diversamente, la 
prossima volta che creerai la tabella si genererà un errore.

(esempio stupido):
kill "file:///home/paolo/mytemptable.csv"

Ovviamente tu dovrai eliminare il file in un modo più intelligente, in 
particolare dovrai ricavare il path del file csv dal path del documento Base 
e magari fare anche un controllo di esistenza del file prima di eliminarlo.
Ricorda che il nome del file creato non è sempre identico al nome usato nella 
query (nome nuova tabella), in particolare, il file è sempre in minuscolo, 
anche se il nome della nova tabella contiene maiuscole, inoltre, tutti i 
caratteri non alfanumerici nel nome della tabella vengono tradotti come 
sottotratti (_)

Ad esempio, la query:
SELECT * INTO TEXT "My Temp-Table" ... eccetera

crea il file: my_temp_table.csv


Comunque, arrivato a questo punto il tuo DB è pulito e lindo come all'inizio e 
sei pronto per una nuova operazione.



spero di essere stato aiutevole
ciao
Paolo M










---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Rispondere a