MySQL :: MySQL 8.0 Manual de referință :: 13.2.10.1 SELECT … INTO Instrucțiune

13.2.10.1 SELECT .. . INTO Declarație

Forma SELECT ... INTO a SELECT activează un rezultat al interogării care trebuie stocat în variabile sau scris într-un fișier:

  • SELECT ... INTO var_list selectează valorile coloanei și le stochează în variabile.

  • SELECT ... INTO OUTFILE scrie rândurile selectate într-un fișier. Terminatoarele de coloane și linii pot fi specificate pentru a produce un format de ieșire specific.

  • SELECT ... INTO DUMPFILE scrie un singur rând într-un fișier fără nicio formatare.

O instrucțiune SELECT dată poate conține cel mult o clauză INTO, deși așa cum se arată în SELECT descrierea sintaxei (vezi Secțiunea 13.2.10,„ Instrucțiunea SELECT ”), INTO poate apărea în poziții diferite:

  • Înainte de FROM. Exemplu:

  • Înainte de o clauză de blocare finală. Exemplu:

  • La sfârșitul SELECT. Exemplu:

la sfârșitul instrucțiunii este acceptată începând cu MySQL 8.0.20 și este poziția preferată. Poziția dinaintea unei clauze de blocare este depreciată începând cu MySQL 8.0.20; în af versiunea uture a MySQL. Cu alte cuvinte, INTO după FROM, dar nu la sfârșitul SELECT produce un avertizare.

O clauză INTO nu trebuie utilizată într-o SELECT imbricată, deoarece un astfel de SELECT trebuie să returneze rezultatul în contextul exterior. Există, de asemenea, constrângeri în ceea ce privește utilizarea INTO în cadrul instrucțiunilor UNION; a se vedea secțiunea 13.2.10.3, „Clauza UNION”.

Pentru varianta INTO var_list :

  • var_list numește o listă cu una sau mai multe variabile, fiecare dintre acestea putând fi o variabilă definită de utilizator, o procedură stocată sau un parametru funcțional , sau variabilă locală a programului stocat. (În cadrul unei instrucțiuni pregătite SELECT ... INTO var_list , sunt permise numai variabilele definite de utilizator; consultați Secțiunea 13.6.4.2, „Domeniul de aplicare și rezoluția variabilei locale” .)

  • Valorile selectate sunt atribuite variabilelor. Numărul de variabile trebuie să se potrivească cu numărul de coloane. Interogarea ar trebui să returneze un singur rând. Dacă interogarea nu returnează niciun rând, apare un avertisment cu codul de eroare 1329 (No data), iar valorile variabilei rămân neschimbate. Dacă interogarea returnează mai multe rânduri, apare eroarea 1172 (Result consisted of more than one row). Dacă este posibil ca instrucțiunea să preia mai multe rânduri, puteți utiliza LIMIT 1 pentru a limita setul de rezultate la un singur rând.

INTO var_list poate fi, de asemenea, utilizat cu o instrucțiune TABLE, sub rezerva acestor restricții:

  • Numărul de variabilele trebuie să se potrivească cu numărul de coloane din tabel.

  • Dacă tabelul conține mai multe rânduri, trebuie să utilizați LIMIT 1 pentru a limita setul de rezultate la un singur rând. LIMIT 1 trebuie să preceadă cuvântul cheie INTO.

Un exemplu a unei astfel de afirmații este prezentată aici:

Puteți selecta, de asemenea, valori dintr-o instrucțiune VALUES care generează o rând unic într-un set de variabile de utilizator. În acest caz, trebuie să utilizați un alias de tabel și trebuie să atribuiți fiecare valoare din lista de valori unei variabile. Fiecare dintre cele două afirmații prezentate aici este echivalentă cu SET @x=2, @y=4, @z=8:

Numele variabilelor utilizator nu sunt sensibile la majuscule și minuscule . Consultați secțiunea 9.4, „Variabile definite de utilizator”.

Forma SELECT ... INTO OUTFILE "file_name " a SELECT scrie rândurile selectate într-un fișier. Fișierul este creat pe gazda serverului, deci trebuie să aveți privilegiul FILE pentru a utiliza această sintaxă. file_name nu poate fi un fișier existent, ceea ce, printre altele, împiedică modificarea fișierelor precum /etc/passwd și tabelele bazei de date. Variabila de sistem character_set_filesystem controlează interpretarea numelui fișierului.

Instrucțiunea SELECT ... INTO OUTFILE este destinată să permită descărcarea unui tabel într-un fișier text de pe gazda serverului.Pentru a crea fișierul rezultat pe o altă gazdă, SELECT ... INTO OUTFILE în mod normal nu este adecvat deoarece nu există nicio modalitate de a scrie o cale către fișier în raport cu sistemul de fișiere gazdă al serverului, cu excepția cazului în care locația fișierul de pe gazda de la distanță poate fi accesat folosind o cale mapată de rețea pe sistemul de fișiere gazdă al serverului.

Alternativ, dacă software-ul client MySQL este instalat pe gazda de la distanță, puteți utiliza o comandă client precum mysql -e "SELECT ..." > file_name pentru a genera fișierul pe gazda respectivă.

SELECT ... INTO OUTFILE este complementul LOAD DATA. Valorile coloanelor sunt scrise convertite în setul de caractere specificat în clauza CHARACTER SET. Dacă nu există o astfel de clauză, valorile sunt eliminate folosind setul de caractere binary. De fapt, nu există o conversie a setului de caractere. Dacă un set de rezultate conține coloane în mai multe seturi de caractere, la fel este și fișierul de date de ieșire și este posibil să nu fie posibil să reîncărcați fișierul corect.

Sintaxa pentru export_options parte a instrucțiunii constă din același FIELDS și LINES clauze care sunt utilizate cu instrucțiunea LOAD DATA. Pentru informații despre clauzele FIELDS și LINES, inclusiv valorile lor implicite și valorile admisibile, consultați Secțiunea 13.2.7, „Declarație de date de încărcare” .

FIELDS ESCAPED BY controlează modul de scriere a caracterelor speciale. Dacă caracterul FIELDS ESCAPED BY nu este gol, este utilizat când necesar pentru a evita ambiguitatea ca prefix care precede următoarele caractere la ieșire:

  • FIELDS ESCAPED BY caracter

  • Caracterul FIELDS ENCLOSED BY

  • Primul caracter al FIELDS TERMINATED BY și LINES TERMINATED BY valori

  • ASCII NUL (octetul cu valoare zero; ceea ce se scrie de fapt după caracterul de evadare este ASCII 0, nu un octet cu valoare zero)

FIELDS TERMINATED BY, ENCLOSED BY, ESCAPED BY , sau LINES TERMINATED BY trebuie scăpate caractere, astfel încât să puteți citi fișierul înapoi în mod fiabil. ASCII NUL este scăpat pentru a facilita vizualizarea cu unele pagere.

Fișierul rezultat nu trebuie să se conformeze sintaxei SQL, așa că nimic altceva nu trebuie scăpat.

Dacă caracterul FIELDS ESCAPED BY este gol, nu se scapă caractere și NULL este afișat ca NULL, nu \N. Probabil că nu este o idee bună să specificați un caracter de evacuare gol, mai ales dacă valorile câmpului din datele dvs. conțin oricare dintre caracterele din lista tocmai dată.

INTO OUTFILE poate fi utilizat și cu o instrucțiune TABLE atunci când doriți să aruncați toate coloanele unui tabel într-un fisier text. În acest caz, ordinea și numărul de rânduri pot fi controlate folosind ORDER BY și LIMIT; aceste clauze trebuie să preceadă INTO OUTFILE. TABLE ... INTO OUTFILE acceptă același export_options ca și SELECT ... INTO OUTFILE și este supus acelorași restricții la scrierea în sistemul de fișiere. Un exemplu de astfel de afirmație este prezentat aici:

Puteți utiliza, de asemenea, SELECT ... INTO OUTFILE cu o declarație VALUES pentru a scrie valorile direct într-un fișier. Un exemplu este prezentat aici:

Trebuie să utilizați un alias de tabel; aliasurile de coloană sunt, de asemenea, acceptate și pot fi utilizate opțional pentru a scrie valori numai din coloanele dorite. De asemenea, puteți utiliza oricare sau toate opțiunile de export acceptate de SELECT ... INTO OUTFILE pentru a formata ieșirea în fișier.

Iată un exemplu care produce un fișier în format de valori separate prin virgulă (CSV) utilizat de mai multe programe:

Dacă utilizați INTO DUMPFILE în loc de INTO OUTFILE, MySQL scrie doar un rând în fișier, fără terminarea coloanei sau a liniilor și fără a efectua nicio procesare de evacuare. Acest lucru este util pentru selectarea unei valori BLOB și stocarea acesteia într-un fișier.

Notă

Orice fișier creat de INTO OUTFILE sau INTO DUMPFILE este deținut de utilizatorul sistemului de operare sub al cărui cont rulează mysqld. (Nu ar trebui să rulați niciodată mysqld ca root din acest motiv și din alte motive.) Începând cu MySQL 8.0.17, masca pentru crearea fișierului este 0640; trebuie să aveți suficiente privilegii de acces pentru a manipula conținutul fișierului. Înainte de MySQL 8.0.17, umask-ul este 0666 și fișierul poate fi scris de toți utilizatorii de pe gazda serverului.

Dacă variabila de sistem secure_file_priv este setată la un nume de director care nu este gol, fișierul care trebuie scris trebuie localizat în acel director.

În contextul instrucțiunilor SELECT ... INTO care apar ca parte a evenimentelor executate de Programatorul de evenimente, mesajele de diagnosticare (nu numai erori, ci și avertismente) sunt scrise în jurnalul de erori și, pe Windows, la jurnalul de evenimente al aplicației. Pentru informații suplimentare, consultați secțiunea 25.4.5, „Starea programatorului de evenimente”.

Începând cu MySQL 8.0.22, este oferită asistență pentru sincronizarea periodică a fișierelor de ieșire scrise de SELECT INTO OUTFILE și SELECT INTO DUMPFILE, activate prin setarea variabilei de sistem a serverului select_into_disk_sync introdusă în acea versiune. Dimensiunea bufferului de ieșire și întârzierea opțională pot fi setați utilizând, respectiv, select_into_buffer_size și select_into_disk_sync_delay. Pentru mai multe informații, consultați descrierile acestor variabile de sistem.

Write a Comment

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *