MySQL :: MySQL 8.0 Reference Manual :: 13.2.10.1 Instruction SELECT … INTO

13.2.10.1 SELECT .. . Instruction INTO

La forme SELECT ... INTO de SELECT permet un résultat de requête à stocker dans des variables ou à écrire dans un fichier:

  • SELECT ... INTO var_list sélectionne les valeurs de colonne et les stocke dans des variables.

  • SELECT ... INTO OUTFILE écrit les lignes sélectionnées dans un fichier. Les terminateurs de colonne et de ligne peuvent être spécifiés pour produire un format de sortie spécifique.

  • SELECT ... INTO DUMPFILE écrit une seule ligne dans un fichier sans aucune mise en forme.

Une instruction SELECT donnée peut contenir au plus une clause INTO, bien que comme indiqué par la SELECT description de la syntaxe (voir Section 13.2.10, » Instruction SELECT « ), le INTO peut apparaître à différentes positions:

  • Avant FROM. Exemple:

  • Avant une clause de verrouillage de fin. Exemple:

  • À la fin de SELECT. Exemple:

Le INTO la position à la fin de l’instruction est prise en charge à partir de MySQL 8.0.20, et est la position préférée. La position avant une clause de verrouillage est obsolète à partir de MySQL 8.0.20; attendez-vous à ce qu’elle soit supprimée. en af version actuelle de MySQL. En d’autres termes, INTO après FROM mais pas à la fin de SELECT produit un Attention.

Une clause INTO ne doit pas être utilisée dans un SELECT imbriqué car un tel SELECT doit renvoyer son résultat au contexte extérieur. Il existe également des contraintes sur l’utilisation de INTO dans les instructions UNION; voir Section 13.2.10.3, « Clause UNION ».

Pour la variante INTO var_list :

  • var_list nomme une liste d’une ou plusieurs variables, chacune pouvant être une variable définie par l’utilisateur, une procédure stockée ou un paramètre de fonction ou une variable locale de programme stockée. (Dans une instruction SELECT ... INTO var_list préparée, seules les variables définies par l’utilisateur sont autorisées; voir Section 13.6.4.2, « Portée et résolution de la variable locale » .)

  • Les valeurs sélectionnées sont affectées aux variables. Le nombre de variables doit correspondre au nombre de colonnes. La requête doit renvoyer une seule ligne. Si la requête ne renvoie aucune ligne, un avertissement avec le code d’erreur 1329 se produit (No data) et les valeurs des variables restent inchangées. Si la requête renvoie plusieurs lignes, l’erreur 1172 se produit (Result consisted of more than one row). S’il est possible que l’instruction récupère plusieurs lignes, vous pouvez utiliser LIMIT 1 pour limiter le jeu de résultats à une seule ligne.

INTO var_list peut également être utilisé avec une instruction TABLE, sous réserve de ces restrictions:

  • Le nombre de les variables doivent correspondre au nombre de colonnes du tableau.

  • Si la table contient plus d’une ligne, vous devez utiliser LIMIT 1 pour limiter le jeu de résultats à une seule ligne. LIMIT 1 doit précéder le mot clé INTO.

Un exemple d’une telle déclaration est affichée ici:

Vous pouvez également sélectionner des valeurs à partir d’une instruction VALUES qui génère une une seule ligne dans un ensemble de variables utilisateur. Dans ce cas, vous devez utiliser un alias de table et vous devez affecter chaque valeur de la liste de valeurs à une variable. Chacune des deux instructions présentées ici équivaut à SET @x=2, @y=4, @z=8:

Les noms des variables utilisateur ne sont pas sensibles à la casse . Voir Section 9.4, «Variables définies par l’utilisateur».

La forme SELECT ... INTO OUTFILE "file_name " de SELECT écrit les lignes sélectionnées dans un fichier. Le fichier est créé sur l’hôte du serveur, vous devez donc disposer du privilège FILE pour utiliser cette syntaxe. file_name ne peut pas être un fichier existant, ce qui empêche entre autres de modifier des fichiers tels que /etc/passwd et des tables de base de données. La variable système character_set_filesystem contrôle l’interprétation du nom de fichier.

L’instruction SELECT ... INTO OUTFILE est destinée à permettre le vidage d’une table dans un fichier texte sur l’hôte du serveur.Pour créer le fichier résultant sur un autre hôte, SELECT ... INTO OUTFILE n’est normalement pas approprié car il n’y a aucun moyen d’écrire un chemin vers le fichier par rapport au système de fichiers hôte du serveur, sauf si l’emplacement du Le fichier sur l’hôte distant est accessible à l’aide d’un chemin mappé sur le réseau sur le système de fichiers hôte du serveur.

Alternativement, si le logiciel client MySQL est installé sur l’hôte distant, vous pouvez utiliser une commande client telle que mysql -e "SELECT ..." > file_name pour générer le fichier sur cet hôte.

SELECT ... INTO OUTFILE est le complément de LOAD DATA. Les valeurs de colonne sont écrites converties dans le jeu de caractères spécifié dans la clause CHARACTER SET. Si aucune clause de ce type n’est présente, les valeurs sont vidées à l’aide du jeu de caractères binary. En effet, il n’y a pas de conversion de jeu de caractères. Si un jeu de résultats contient des colonnes dans plusieurs jeux de caractères, il en va de même pour le fichier de données de sortie et il peut ne pas être possible de recharger le fichier correctement.

La syntaxe de la partie export_options de l’instruction se compose des mêmes FIELDS et LINES clauses utilisées avec l’instruction LOAD DATA. Pour plus d’informations sur les clauses FIELDS et LINES, y compris leurs valeurs par défaut et les valeurs autorisées, reportez-vous à la Section 13.2.7, « Instruction LOAD DATA » .

FIELDS ESCAPED BY contrôle comment écrire les caractères spéciaux. Si le caractère FIELDS ESCAPED BY n’est pas vide, il est utilisé lorsque nécessaire pour éviter toute ambiguïté comme préfixe qui précède les caractères suivants en sortie:

  • Le FIELDS ESCAPED BY caractère

  • Le caractère FIELDS ENCLOSED BY

  • Le premier caractère du FIELDS TERMINATED BY et LINES TERMINATED BY valeurs

  • ASCII NUL (l’octet de valeur zéro; ce qui est réellement écrit après le caractère d’échappement est ASCII 0, pas un octet de valeur zéro)

Les FIELDS TERMINATED BY, ENCLOSED BY, ESCAPED BY , ou les caractères LINES TERMINATED BY doivent être échappés pour que vous puissiez relire le fichier de manière fiable. ASCII NUL est échappé pour faciliter la visualisation avec certains pagers.

Le fichier résultant n’a pas besoin d’être conforme à la syntaxe SQL, donc rien d’autre n’a besoin d’être échappé.

Si le caractère FIELDS ESCAPED BY est vide, aucun caractère n’est échappé et NULL est affiché sous la forme NULL, pas \N. Ce n’est probablement pas une bonne idée de spécifier un caractère d’échappement vide, en particulier si les valeurs de champ dans vos données contiennent l’un des caractères de la liste que vous venez de donner.

INTO OUTFILE peut également être utilisé avec une instruction TABLE lorsque vous souhaitez vider toutes les colonnes d’une table dans un fichier texte. Dans ce cas, l’ordre et le nombre de lignes peuvent être contrôlés en utilisant ORDER BY et LIMIT; ces clauses doivent précéder INTO OUTFILE. TABLE ... INTO OUTFILE prend en charge le même export_options que SELECT ... INTO OUTFILE, et il est soumis aux mêmes restrictions lors de l’écriture dans le système de fichiers. Un exemple d’une telle déclaration est montré ici:

Vous pouvez également utiliser SELECT ... INTO OUTFILE avec une instruction VALUES pour écrire valeurs directement dans un fichier. Un exemple est montré ici:

Vous devez utiliser un alias de table; Les alias de colonne sont également pris en charge et peuvent éventuellement être utilisés pour écrire des valeurs uniquement à partir des colonnes souhaitées. Vous pouvez également utiliser une ou toutes les options d’exportation prises en charge par SELECT ... INTO OUTFILE pour formater la sortie dans le fichier.

Voici un exemple qui produit un fichier au format CSV (valeurs séparées par des virgules) utilisé par de nombreux programmes:

Si vous utilisez INTO DUMPFILE au lieu de INTO OUTFILE, MySQL écrit une seule ligne dans le fichier, sans aucune terminaison de colonne ou de ligne et sans effectuer de traitement d’échappement. Ceci est utile pour sélectionner une valeur BLOB et la stocker dans un fichier.

Remarque

Tout fichier créé par INTO OUTFILE ou INTO DUMPFILE appartient à l’utilisateur du système d’exploitation sous le compte duquel mysqld s’exécute. (Vous ne devriez jamais exécuter mysqld en tant que root pour cette raison et d’autres.) Depuis MySQL 8.0.17, le umask pour la création de fichiers est 0640; vous devez disposer de privilèges d’accès suffisants pour manipuler le contenu du fichier. Avant MySQL 8.0.17, le umask est 0666 et le fichier est accessible en écriture par tous les utilisateurs sur l’hôte du serveur.

Si la variable système secure_file_priv est définie sur un nom de répertoire non vide, le fichier à écrire doit se trouver dans ce répertoire.

Dans le contexte des instructions SELECT ... INTO qui se produisent dans le cadre d’événements exécutés par le planificateur d’événements, les messages de diagnostic (non seulement les erreurs, mais aussi les avertissements) sont écrits dans le journal des erreurs et, sous Windows, au journal des événements de l’application. Pour plus d’informations, reportez-vous à la Section 25.4.5, «Statut du planificateur d’événements».

À partir de MySQL 8.0.22, une prise en charge est fournie pour la synchronisation périodique des fichiers de sortie écrits par SELECT INTO OUTFILE et SELECT INTO DUMPFILE, activés en définissant la variable système du serveur select_into_disk_sync introduite dans cette version. La taille du tampon de sortie et le délai facultatif peuvent être défini en utilisant, respectivement, select_into_buffer_size et select_into_disk_sync_delay. Pour plus d’informations, consultez les descriptions de ces variables système.

Write a Comment

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *