Domanda

Qualche tempo fa ero alla ricerca di un modo per inserire i valori in un campo di testo attraverso isql e alla fine ha trovato un certo carico di comando che ha funzionato per me.

Non funziona, quando cerco di eseguirlo da Perl.Ho un errore di sintassi.Ho provato due metodi distinti ed entrambi non funzionano così lontano.

Ho l'istruzione SQL variabile di stampa alla fine di ogni ciclo di loop, così so che la sintassi è corretta, ma solo ottenere attraverso correttamente.

Ecco l'ultimo elemento di cattura di codice mi è stato di prova:

foreach(@files)
{

$STMT = <<EOF;
load from $_ insert into some_table
EOF

$sth = $db1->prepare($STMT);
$sth->execute;

}

@files è una matrice i cui elementi sono di un percorso completo/posizione di un tubo di file di testo delimitato da (ex./home/xx/xx/xx/something.txt)

Il numero di colonne della tabella corrisponde al numero di campi nel file di testo e il tipo di controllo è bene (ho caricato il file di prova manualmente senza fallire)

L'errore che tornare indietro è:

DBD::Informix::db prepare failed: SQL: -201: A syntax error has occurred.

Qualsiasi idea di cosa potrebbe essere la causa?


MODIFICA di RET e Petr risposte

$STMT = "'LOAD FROM $_ INSERT INTO table'";
    system("echo $STMT | isql $db")

L'ho dovuto cambiare per questo, perché il morire comando di una forza innaturale, la morte e la dichiarazione doveva essere avvolto tra virgolette singole.

È stato utile?

Soluzione

Petr è esattamente a destra, l'istruzione LOAD è un ISQL o DB-estensione, quindi non è possibile eseguire attraverso DBI.Se hai un occhiata al manuale, scoprirete che è anche la sintassi non valida per SPL, ESQL/C e così via.

Non è chiaro se è necessario utilizzare perl per eseguire lo script, o perl è solo un comodo modo per generare il codice SQL.

Se il primo, e si desidera un puro perl metodo, è necessario preparare un'istruzione INSERT (c'è solo un tavolo coinvolti guardare?), e slurp attraverso il file, utilizzando split suddividerla in colonne e l'esecuzione del preparato inserire.

In caso contrario, è possibile generare SQL perl ed eseguirlo tramite DB-Accesso, direttamente con system o avvolgendo entrambi in uno shell script o un file batch DOS.

Chiamata di sistema versione

foreach (@files) {
    my $stmt = "LOAD FROM $_ INSERT INTO table;\n";
    system("echo $stmt | dbaccess $database")
            || die "Statement $stmt failed: $!\n";
}

In uno script batch versione, si potrebbe scrivere tutto il codice SQL in un unico script, vale a dire:

perl -e 'while(@ARGV){shift; print "LOAD FROM '$_' INSERT INTO table;\n"}' file1 [ file2 ... ] > loadfiles.sql
isql database loadfiles.sql

NB, il commento citazioni sul nome del file è rilevante solo se il nome del file contiene spazi o metacaratteri, il solito problema.

Inoltre, una fondamentale differenza nel comportamento tra isql e dbaccess è che, quando eseguito in questo modo, dbaccess non si ferma in caso di errore, ma isql volontà.Per rendere dbaccess interrompere il trattamento in caso di errore, impostare DBACCNOIGN=1 nell'ambiente.

Spero che utile.

Altri suggerimenti

Questo perchè la query non è di query SQL, è un isql comando che dice isql per analizzare i file di input e di generare una INSERT.

Se ci pensate, il server può essere su una macchina del tutto diversa e non ha idea di che file stai parlando e come accedervi.

Quindi, fondamentalmente hai due opzioni:

  1. chiamata isql e tubo di CARICO, il comando di molto brutto
  2. analizzare il file e generare le istruzioni INSERT

Siete pregati di notare che il file Notes/load.unload è distribuito con DBD::Informix e contiene le linee guida su come gestire le operazioni di SCARICO utilizzando Perl DBI e DBD::Informix.Un po ' per il mio dispiacere, vedo che si dice "T. B. D." (più o meno) per il CARICO di sezione.

Come altri hanno detto, il CARICO e SCARICO dichiarazioni sono viziate da vari strumenti lato client a guardare come SQL, ma il server Informix non li supporta stesso, principalmente a causa del problema con ottenere il file da un computer client (forse un PC) per la macchina server (forse un computer Solaris).

Per simulare il CARICO di istruzione, è necessario analizzare il INSERT INTO Table parte.Se è elencato colonne (INSERT INTO Table(Col03, Col05, Col09)), quindi ci si può aspettare di tre valori nel caricare file di dati, e in quei tre colonne.Vuoi preparare una dichiarazione 'SELECT Col03, Col05, Col09 FROM Table'per ottenere i tipi delle colonne.In caso contrario, è necessario preparare un'istruzione 'SELECT * FROM Table"per ottenere l'elenco completo di colonne (e i loro tipi).Dato i nomi di colonna e il numero di colonne, è possibile creare e preparare una adeguata istruzione insert:'INSERT INTO Table(Col03, Col05, Col09) VALUES(?,?,?)'o 'INSERT INTO Table VALUES(?,?,?,?,?,?,?,?,?)'.Si potrebbe (forse dovrebbe) includono i nomi di colonna nella seconda.

Con che pronto, è ora di analizzare lo scarico dei dati.C'è un documento disponibile in SQLCMD programma disponibile dal IIUG Archivio di Software (che è stato in giro molto più a lungo rispetto a quelle di Microsoft upstart programma con lo stesso nome).Che descrive la SCARICA in formato in dettaglio notevole.Perl ha la capacità di gestire qualsiasi cosa, Informix usa testimonia il SCARICARE informazioni in load.unload file distribuito con DBD::Informix.

Un po ' veloce di Googling ha mostrato che la sintassi per caricare mette le virgolette attorno al nome del file.Cosa succede se si cambia la tua affermazione:

load from '$_' insert into some_table

Dal momento che la sua dichiarazione non utilizza segnaposto, devi mettere le virgolette in se stessi, piuttosto che in DBI, citando la funzionalità.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top