Spec-Zone .ru
спецификации, руководства, описания, API

13.2.9.1. SELECT ... INTOСинтаксис

SELECT ... INTO форма SELECT позволяет результату запроса быть сохраненным в переменных или записанным файлу:

SELECT описание синтаксиса (см. Раздел 13.2.9,"SELECT Синтаксис"), показывает INTO пункт около конца оператора. Также возможно использовать INTO сразу после select_expr список.

INTO пункт не должен использоваться во вложенном SELECT потому что такой SELECT должен возвратить его результат внешнему контексту.

INTO пункт может назвать список одной или более переменных, которые могут быть определяемыми пользователем переменными, хранимой процедурой или параметрами функции, или сохраненными локальными переменными программы. (В пределах готового SELECT ... INTO OUTFILE оператор, только определяемые пользователем переменные разрешаются; см. Раздел 13.6.4.2, "Контекст локальной переменной и Разрешение".)

Выбранные значения присваиваются переменным. Число переменных должно соответствовать число столбцов. Запрос должен возвратить единственную строку. Если запрос не возвращает строк, предупреждения с кодом ошибки, 1329 происходит (No data), и значения переменных остаются неизменными. Если запрос возвращает многократные строки, ошибка, 1172 происходит (Result consisted of more than one row). Если возможно, что оператор может получить многократные строки, можно использовать LIMIT 1 ограничить набор результатов единственной строкой.

SELECT id, data INTO @x, @y FROM test.t1 LIMIT 1;

Пользовательские имена переменной не являются чувствительными к регистру. См. Раздел 9.4, "Определяемые пользователем Переменные".

SELECT ... INTO OUTFILE 'file_name' форма SELECT пишут выбранные строки в файл. Файл создается на узле сервера, таким образом, Вы должны иметь FILE полномочие использовать этот синтаксис. file_name не может быть существующий файл, который между прочим предотвращает файлы такой как /etc/passwd и таблицы базы данных от того, чтобы быть уничтоженным. character_set_filesystem системная переменная управляет интерпретацией имени файла.

SELECT ... INTO OUTFILE оператор предназначается прежде всего, чтобы позволить Вам очень быстро выводить таблицу к текстовому файлу на машине сервера. Если Вы хотите создать получающийся файл на некотором другом узле чем узел сервера, обычно невозможно использовать SELECT ... INTO OUTFILE с тех пор нет никакого способа записать путь к файлу относительно файловой системы узла сервера.

Однако, если клиентское программное обеспечение MySQL устанавливается на удаленной машине, можно вместо этого использовать клиентскую команду такой как mysql -e "SELECT ..." > file_name генерировать файл на хосте клиента.

Также возможно создать получающийся файл на различном узле кроме узла сервера, если к расположению файла на удаленном узле можно получить доступ, используя отображенный на сеть путь на файловой системе сервера. В этом случае присутствие mysql (или некоторая другая клиентская программа MySQL) не требуется на целевом узле.

SELECT ... INTO OUTFILE дополнение LOAD DATA INFILE. Значения столбцов пишутся преобразованный в набор символов, определенный в CHARACTER SET пункт. Если никакой такой пункт не присутствует, значения выводятся, используя binary набор символов. В действительности нет никакого преобразования набора символов. Если набор результатов будет содержать столбцы в нескольких наборах символов, то файл выходных данных будет также, и Вы не можете быть в состоянии перезагрузить файл правильно.

Синтаксис для export_options часть оператора состоит из того же самого FIELDS и LINES пункты, которые используются с LOAD DATA INFILE оператор. См. Раздел 13.2.6,"LOAD DATA INFILE Синтаксис", для информации о FIELDS и LINES пункты, включая их значения по умолчанию и допустимые значения.

FIELDS ESCAPED BY средства управления, как записать специальные символы. Если FIELDS ESCAPED BY символ не пуст, он используется когда необходимо, чтобы избежать неоднозначности как префикса, который предшествует следующим символам на выводе:

FIELDS TERMINATED BY, ENCLOSED BY, ESCAPED BY, или LINES TERMINATED BY символов нужно оставить так, чтобы можно было читать, файл въезжают задним ходом достоверно. ASCII NUL оставляется, чтобы облегчить просматривать с некоторыми пейджерами.

Получающийся файл не должен соответствовать синтаксису SQL, таким образом, ничто иное не должно быть оставленным.

Если FIELDS ESCAPED BY символ пуст, никаких символов не оставляют и NULL выводится как NULL, нет \N. Это - вероятно, не хорошая идея определить пустой символ ESC, особенно если значения полей в Ваших данных содержат какой-либо из символов в списке, только данном.

Вот пример, который производит файл в разделенных от запятой значениях (CSV) формат, используемый многими программами:

SELECT a,b,a+b INTO OUTFILE '/tmp/result.txt'  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'  LINES TERMINATED BY '\n'  FROM test_table;

Если Вы используете INTO DUMPFILE вместо INTO OUTFILE, MySQL пишет только одну строку в файл без любого столбца или завершения строки и не выполняя обработки escape. Это полезно, если Вы хотите сохранить a BLOB значение в файле.

Отметить

Любой файл, создаваемый INTO OUTFILE или INTO DUMPFILE перезаписываемо всеми пользователями на узле сервера. Причина этого состоит в том, что сервер MySQL не может создать файл, который принадлежит любому кроме пользователя, при учетной записи которого он работает. (Никогда недопустимо выполнять mysqld как root для этого и других причин.) Файл таким образом должен быть мировым перезаписываемым так, чтобы можно было управлять его содержанием.

Если secure_file_priv системная переменная устанавливается в непустое имя каталога, файл, который будет записан, должен быть расположен в том каталоге.

В контексте SELECT ... INTO операторы, которые происходят как часть событий, выполняемых Планировщиком События, сообщения диагностики (не только ошибки, но также и предупреждения) пишутся журналу ошибок, и, на Windows, к журналу событий приложения. Для дополнительной информации см. Раздел 19.4.5, "Состояние Планировщика События".