MySQL :: MySQL 8.0 Reference Manual :: 13.2.10.1 Instrução SELECT … INTO

13.2.10.1 SELECT .. . Instrução INTO

A SELECT ... INTO forma de SELECT permite um resultado de consulta a ser armazenado em variáveis ou gravado em um arquivo:

  • SELECT ... INTO var_list seleciona os valores da coluna e os armazena em variáveis.

  • SELECT ... INTO OUTFILE grava as linhas selecionadas em um arquivo. Terminadores de coluna e linha podem ser especificados para produzir um formato de saída específico.

  • SELECT ... INTO DUMPFILE grava uma única linha em um arquivo sem qualquer formatação.

Uma determinada instrução SELECT pode conter no máximo uma INTO cláusula, embora conforme mostrado pela SELECT descrição da sintaxe (consulte a Seção 13.2.10,” Instrução SELECT “), a INTO pode aparecer em posições diferentes:

  • Antes de FROM. Exemplo:

  • Antes de uma cláusula de bloqueio final. Exemplo:

  • No final do SELECT. Exemplo:

O INTO a posição no final da instrução é suportada no MySQL 8.0.20 e é a posição preferida. A posição antes de uma cláusula de bloqueio está obsoleta no MySQL 8.0.20; espera-se que o suporte seja removido em af versão original do MySQL. Em outras palavras, INTO após FROM, mas não no final do SELECT produz um aviso.

Uma INTO cláusula não deve ser usada em uma SELECT aninhada porque tal SELECT deve retornar seu resultado para o contexto externo. Também existem restrições ao uso de INTO dentro de UNION instruções; consulte a Seção 13.2.10.3, “Cláusula UNION”.

Para a variante INTO var_list :

  • var_list nomeia uma lista de uma ou mais variáveis, cada uma das quais pode ser uma variável definida pelo usuário, procedimento armazenado ou parâmetro de função , ou variável local do programa armazenado. (Dentro de uma instrução SELECT ... INTO var_list preparada, apenas variáveis definidas pelo usuário são permitidas; consulte a Seção 13.6.4.2, “Escopo e resolução da variável local” .)

  • Os valores selecionados são atribuídos às variáveis. O número de variáveis deve corresponder ao número de colunas. A consulta deve retornar uma única linha. Se a consulta não retornar nenhuma linha, ocorrerá um aviso com o código de erro 1329 (No data) e os valores das variáveis permanecerão inalterados. Se a consulta retornar várias linhas, ocorrerá o erro 1172 (Result consisted of more than one row). Se for possível que a instrução possa recuperar várias linhas, você pode usar LIMIT 1 para limitar o conjunto de resultados a uma única linha.

INTO var_list também pode ser usado com uma instrução TABLE, sujeita a estas restrições:

  • O número de as variáveis devem corresponder ao número de colunas da tabela.

  • Se a tabela contiver mais de uma linha, você deve usar LIMIT 1 para limitar o conjunto de resultados a uma única linha. LIMIT 1 deve preceder a INTO palavra-chave.

Um exemplo de tal declaração é mostrado aqui:

Você também pode selecionar valores de uma declaração VALUES que gera uma única linha em um conjunto de variáveis de usuário. Nesse caso, você deve empregar um alias de tabela e atribuir cada valor da lista de valores a uma variável. Cada uma das duas instruções mostradas aqui é equivalente a SET @x=2, @y=4, @z=8:

Os nomes das variáveis do usuário não diferenciam maiúsculas de minúsculas . Consulte a Seção 9.4, “Variáveis definidas pelo usuário”.

A forma SELECT ... INTO OUTFILE "file_name " de SELECT grava as linhas selecionadas em um arquivo. O arquivo é criado no host do servidor, portanto, você deve ter o privilégio FILE para usar esta sintaxe. file_name não pode ser um arquivo existente, o que, entre outras coisas, impede que arquivos como /etc/passwd e tabelas de banco de dados sejam modificados. A variável do sistema character_set_filesystem controla a interpretação do nome do arquivo.

A instrução SELECT ... INTO OUTFILE tem como objetivo permitir o dump de uma tabela em um arquivo de texto no host do servidor.Para criar o arquivo resultante em algum outro host, SELECT ... INTO OUTFILE normalmente não é adequado porque não há maneira de gravar um caminho para o arquivo relativo ao sistema de arquivos do host do servidor, a menos que a localização do O arquivo no host remoto pode ser acessado usando um caminho mapeado pela rede no sistema de arquivos do host do servidor.

Alternativamente, se o software do cliente MySQL estiver instalado no host remoto, você pode usar um comando do cliente como mysql -e "SELECT ..." > file_name para gerar o arquivo nesse host.

SELECT ... INTO OUTFILE é o complemento de LOAD DATA. Os valores da coluna são gravados e convertidos no conjunto de caracteres especificado na cláusula CHARACTER SET. Se nenhuma cláusula estiver presente, os valores são despejados usando o conjunto de caracteres binary. Na verdade, não há conversão de conjunto de caracteres. Se um conjunto de resultados contém colunas em vários conjuntos de caracteres, o arquivo de dados de saída também contém, e pode não ser possível recarregar o arquivo corretamente.

A sintaxe para a export_options parte da instrução consiste na mesma FIELDS e LINES cláusulas que são usadas com a instrução LOAD DATA. Para obter informações sobre as cláusulas FIELDS e LINES, incluindo seus valores padrão e permitidos, consulte a Seção 13.2.7, “Instrução LOAD DATA” .

FIELDS ESCAPED BY controla como escrever caracteres especiais. Se o FIELDS ESCAPED BY caractere não estiver vazio, ele será usado quando necessário para evitar ambigüidade como um prefixo que precede os seguintes caracteres na saída:

  • O FIELDS ESCAPED BY caractere

  • O FIELDS ENCLOSED BY caractere

  • O primeiro caractere do FIELDS TERMINATED BY e LINES TERMINATED BY valores

  • ASCII NUL (o byte com valor zero; o que é realmente escrito após o caractere de escape é ASCII 0, não um byte com valor zero)

O FIELDS TERMINATED BY, ENCLOSED BY, ESCAPED BY , ou LINES TERMINATED BY caracteres devem ser escapados para que você possa ler o arquivo de volta com segurança. ASCII NUL é escapado para facilitar a visualização com alguns pagers.

O arquivo resultante não precisa estar em conformidade com a sintaxe SQL, portanto, nada mais precisa ser escapado.

Se o caractere FIELDS ESCAPED BY estiver vazio, nenhum caractere será escapado e NULL será gerado como NULL, não \N. Provavelmente não é uma boa ideia especificar um caractere de escape vazio, principalmente se os valores de campo em seus dados contiverem qualquer um dos caracteres da lista fornecida.

INTO OUTFILE também pode ser usado com uma instrução TABLE quando você deseja despejar todas as colunas de uma tabela em um arquivo de texto. Nesse caso, a ordem e o número de linhas podem ser controlados usando ORDER BY e LIMIT; essas cláusulas devem preceder INTO OUTFILE. TABLE ... INTO OUTFILE oferece suporte ao mesmo export_options que SELECT ... INTO OUTFILE e está sujeito às mesmas restrições ao gravar no sistema de arquivos. Um exemplo de tal declaração é mostrado aqui:

Você também pode usar SELECT ... INTO OUTFILE com uma declaração VALUES para escrever valores diretamente em um arquivo. Um exemplo é mostrado aqui:

Você deve usar um alias de tabela; aliases de coluna também são suportados e podem ser usados opcionalmente para gravar valores apenas das colunas desejadas. Você também pode usar qualquer uma ou todas as opções de exportação suportadas por SELECT ... INTO OUTFILE para formatar a saída para o arquivo.

Aqui está um exemplo que produz um arquivo no formato de valores separados por vírgula (CSV) usado por muitos programas:

Se você usar INTO DUMPFILE em vez de INTO OUTFILE, o MySQL grava apenas uma linha no arquivo, sem nenhuma coluna ou terminação de linha e sem realizar nenhum processamento de escape. Isso é útil para selecionar um valor BLOB e armazená-lo em um arquivo.

Nota

Qualquer arquivo criado por INTO OUTFILE ou INTO DUMPFILE é propriedade do usuário do sistema operacional sob cuja conta o mysqld é executado. (Você nunca deve executar o mysqld como root por este e outros motivos.) A partir do MySQL 8.0.17, o umask para criação de arquivo é 0640; você deve ter privilégios de acesso suficientes para manipular o conteúdo do arquivo. Antes do MySQL 8.0.17, o umask é 0666 e o arquivo pode ser escrito por todos os usuários no host do servidor.

Se a variável de sistema secure_file_priv for definida como um nome de diretório não vazio, o arquivo a ser gravado deve estar localizado nesse diretório.

No contexto de SELECT ... INTO instruções que ocorrem como parte de eventos executados pelo Programador de eventos, as mensagens de diagnóstico (não apenas erros, mas também avisos) são gravadas no log de erros e, no Windows, para o log de eventos do aplicativo. Para obter informações adicionais, consulte a Seção 25.4.5, “Event Scheduler Status”.

A partir do MySQL 8.0.22, o suporte é fornecido para a sincronização periódica de arquivos de saída gravados por SELECT INTO OUTFILE e SELECT INTO DUMPFILE, ativados pela configuração da variável de sistema do servidor select_into_disk_sync introduzida nessa versão. Tamanho do buffer de saída e atraso opcional podem ser definido usando, respectivamente, select_into_buffer_size e select_into_disk_sync_delay. Para obter mais informações, consulte as descrições dessas variáveis de sistema.

Write a Comment

O seu endereço de email não será publicado. Campos obrigatórios marcados com *