MySQL :: MySQL 8.0 Manuale di riferimento :: 13.2.10.1 Istruzione SELECT … INTO

13.2.10.1 SELECT .. . Istruzione INTO

La SELECT ... INTO forma di SELECT abilita un risultato della query da memorizzare in variabili o da scrivere in un file:

  • SELECT ... INTO var_list seleziona i valori delle colonne e li memorizza in variabili.

  • SELECT ... INTO OUTFILE scrive le righe selezionate in un file. È possibile specificare terminatori di riga e di colonna per produrre un formato di output specifico.

  • SELECT ... INTO DUMPFILE scrive una singola riga in un file senza alcuna formattazione.

Una determinata istruzione SELECT può contenere al massimo una INTO clausola, sebbene come mostrato dalla SELECT descrizione della sintassi (vedere Sezione 13.2.10,” Istruzione SELECT “), INTO può apparire in diverse posizioni:

  • Prima di FROM. Esempio:

  • Prima di una clausola di blocco finale. Esempio:

  • Alla fine del SELECT. Esempio:

Il INTO la posizione alla fine dell’istruzione è supportata a partire da MySQL 8.0.20 ed è la posizione preferita. La posizione prima di una clausola di blocco è deprecata a partire da MySQL 8.0.20; aspettatevi che il supporto venga rimosso in af utura versione di MySQL. In altre parole, INTO dopo FROM ma non alla fine del SELECT produce un avvertimento.

Una clausola INTO non deve essere utilizzata in un SELECT nidificato perché SELECT deve restituire il risultato al contesto esterno. Ci sono anche vincoli sull’uso di INTO all’interno di UNION istruzioni; vedere la Sezione 13.2.10.3, “Clausola UNION”.

Per la variante INTO var_list :

  • var_list nomina un elenco di una o più variabili, ciascuna delle quali può essere una variabile definita dall’utente, una procedura memorizzata o un parametro di funzione , o variabile locale del programma memorizzato. (All’interno di un’istruzione SELECT ... INTO var_list preparata, sono consentite solo variabili definite dall’utente; vedere la Sezione 13.6.4.2, “Ambito e risoluzione delle variabili locali” .)

  • I valori selezionati vengono assegnati alle variabili. Il numero di variabili deve corrispondere al numero di colonne. La query dovrebbe restituire una singola riga. Se la query non restituisce righe, viene visualizzato un avviso con codice di errore 1329 (No data) e i valori delle variabili rimangono invariati. Se la query restituisce più righe, si verifica l’errore 1172 (Result consisted of more than one row). Se è possibile che l’istruzione recuperi più righe, puoi utilizzare LIMIT 1 per limitare il set di risultati a una singola riga.

INTO var_list può anche essere utilizzato con un’istruzione TABLE, soggetta a queste restrizioni:

  • Il numero di le variabili devono corrispondere al numero di colonne nella tabella.

  • Se la tabella contiene più di una riga, è necessario utilizzare LIMIT 1 per limitare il set di risultati a una singola riga. LIMIT 1 deve precedere la INTO parola chiave.

Un esempio di tale istruzione è mostrato qui:

Puoi anche selezionare valori da un’istruzione VALUES che genera un’istruzione singola riga in un insieme di variabili utente. In questo caso, è necessario utilizzare un alias di tabella e assegnare ogni valore dall’elenco di valori a una variabile. Ciascuna delle due istruzioni mostrate qui è equivalente a SET @x=2, @y=4, @z=8:

I nomi delle variabili utente non fanno distinzione tra maiuscole e minuscole . Vedere la Sezione 9.4, “Variabili definite dall’utente”.

La forma SELECT ... INTO OUTFILE "file_name " di SELECT scrive le righe selezionate in un file. Il file viene creato sull’host del server, quindi è necessario disporre del privilegio FILE per utilizzare questa sintassi. file_name non può essere un file esistente, il che, tra le altre cose, impedisce la modifica di file come /etc/passwd e tabelle di database. La variabile di sistema character_set_filesystem controlla l’interpretazione del nome file.

L’istruzione SELECT ... INTO OUTFILE ha lo scopo di abilitare il dump di una tabella in un file di testo sull’host del server.Per creare il file risultante su un altro host, SELECT ... INTO OUTFILE normalmente non è adatto perché non è possibile scrivere un percorso per il file relativo al file system host del server, a meno che la posizione del è possibile accedere al file sull’host remoto utilizzando un percorso mappato in rete sul file system dell’host del server.

In alternativa, se il software client MySQL è installato sull’host remoto, è possibile utilizzare un comando client come mysql -e "SELECT ..." > file_name per generare il file su quell’host.

SELECT ... INTO OUTFILE è il complemento di LOAD DATA. I valori delle colonne vengono scritti convertiti nel set di caratteri specificato nella clausola CHARACTER SET. Se non è presente alcuna clausola di questo tipo, i valori vengono scaricati utilizzando il set di caratteri binary. In effetti, non c’è conversione del set di caratteri. Se un set di risultati contiene colonne in diversi set di caratteri, lo è anche il file di dati di output e potrebbe non essere possibile ricaricare il file correttamente.

La sintassi per la parte export_options dell’istruzione è costituita dalla stessa FIELDS e utilizzate con l’istruzione LOAD DATA. Per informazioni sulle clausole FIELDS e LINES, inclusi i valori predefiniti e i valori consentiti, vedere la Sezione 13.2.7, “Istruzione LOAD DATA” .

FIELDS ESCAPED BY controlla come scrivere caratteri speciali. Se il carattere FIELDS ESCAPED BY non è vuoto, viene utilizzato quando necessario per evitare ambiguità come prefisso che precede i seguenti caratteri sull’output:

  • Il FIELDS ESCAPED BY carattere

  • Il FIELDS ENCLOSED BY carattere

  • Il primo carattere del FIELDS TERMINATED BY e LINES TERMINATED BY valori

  • ASCII NUL (il byte con valore zero; ciò che viene effettivamente scritto dopo il carattere di escape è ASCII 0, non un byte con valore zero)

FIELDS TERMINATED BY, ENCLOSED BY, ESCAPED BY oppure LINES TERMINATED BY i caratteri devono essere preceduti da caratteri di escape in modo da poter leggere nuovamente il file in modo affidabile. ASCII NUL è sottoposto a escape per facilitarne la visualizzazione con alcuni cercapersone.

Il file risultante non deve essere conforme alla sintassi SQL, quindi non è necessario eliminare nient’altro.

Se il carattere FIELDS ESCAPED BY è vuoto, nessun carattere viene sottoposto a escape e NULL viene restituito come NULL, non \N. Probabilmente non è una buona idea specificare un carattere di escape vuoto, in particolare se i valori dei campi nei dati contengono uno dei caratteri nell’elenco appena fornito.

INTO OUTFILE può essere utilizzato anche con un’istruzione TABLE quando si desidera eseguire il dump di tutte le colonne di una tabella in una file di testo. In questo caso, l’ordine e il numero di righe possono essere controllati utilizzando ORDER BY e LIMIT; queste clausole devono precedere INTO OUTFILE. TABLE ... INTO OUTFILE supporta lo stesso export_options di SELECT ... INTO OUTFILE ed è soggetto alle stesse limitazioni durante la scrittura nel file system. Un esempio di tale istruzione è mostrato qui:

Puoi anche usare SELECT ... INTO OUTFILE con un’istruzione VALUES da scrivere valori direttamente in un file. Di seguito viene mostrato un esempio:

È necessario utilizzare un alias di tabella; sono supportati anche gli alias di colonna e possono essere utilizzati facoltativamente per scrivere valori solo dalle colonne desiderate. Puoi anche utilizzare una o tutte le opzioni di esportazione supportate da SELECT ... INTO OUTFILE per formattare l’output nel file.

Di seguito è riportato un esempio che produce un file nel formato CSV (valori delimitati da virgole) utilizzato da molti programmi:

Se utilizzi INTO DUMPFILE invece di INTO OUTFILE, MySQL scrive solo una riga nel file, senza alcuna colonna o terminazione di riga e senza eseguire alcuna elaborazione di escape. Ciò è utile per selezionare un valore BLOB e memorizzarlo in un file.

Nota

Qualsiasi file creato da INTO OUTFILE o INTO DUMPFILE è di proprietà dell’utente del sistema operativo con il cui account viene eseguito mysqld. (Non dovresti mai eseguire mysqld come root per questo e altri motivi.) A partire da MySQL 8.0.17, l’umask per la creazione dei file è 0640; è necessario disporre di privilegi di accesso sufficienti per manipolare il contenuto del file. Prima di MySQL 8.0.17, l’umask è 0666 e il file è scrivibile da tutti gli utenti sull’host del server.

Se la variabile di sistema secure_file_priv è impostata su un nome di directory non vuoto, il file da scrivere deve trovarsi in quella directory.

Nel contesto delle istruzioni SELECT ... INTO che si verificano come parte di eventi eseguiti da Event Scheduler, i messaggi di diagnostica (non solo gli errori, ma anche gli avvisi) vengono scritti nel registro degli errori e, in Windows, al registro eventi dell’applicazione. Per ulteriori informazioni, vedere la Sezione 25.4.5, “Stato dell’utilità di pianificazione degli eventi”.

A partire da MySQL 8.0.22, viene fornito supporto per la sincronizzazione periodica dei file di output scritti da SELECT INTO OUTFILE e SELECT INTO DUMPFILE, abilitati impostando la select_into_disk_sync variabile di sistema del server introdotta in quella versione. La dimensione del buffer di output e il ritardo opzionale possono essere impostato utilizzando, rispettivamente, select_into_buffer_size e select_into_disk_sync_delay. Per ulteriori informazioni, vedere le descrizioni di queste variabili di sistema.

Write a Comment

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *