EXECUTE IMMEDIATE FROM¶
EXECUTE IMMEDIATE FROM executa as instruções SQL especificadas em um arquivo em um estágio. O arquivo pode conter instruções SQL ou blocos do Script Snowflake. As instruções devem ser instruções SQL sintaticamente corretas.
Você pode usar o comando EXECUTE IMMEDIATE FROM para executar as instruções em um arquivo de qualquer sessão do Snowflake.
Esse recurso fornece um mecanismo para controlar a implantação e o gerenciamento de objetos e códigos do Snowflake. Por exemplo, você pode executar um script armazenado para criar um ambiente Snowflake padrão para todas as suas contas. O script de configuração pode incluir instruções que criam usuários, funções, bancos de dados e esquemas para cada nova conta.
Criação de modelos Jinja2¶
EXECUTE IMMEDIATE FROM também pode executar um arquivo de modelo usando a linguagem de modelos Jinja2. Um modelo pode conter variáveis e expressões, permitindo o uso de loops, condicionais, substituição de variáveis, macros e muito mais. Os modelos também podem incluir outros modelos e importar macros definidas em outros arquivos localizados em um estágio.
Para obter mais informações sobre a linguagem de modelagem, consulte a Documentação do Jinja2.
O arquivo de modelo a ser executado deve ser:
Um modelo Jinja2 sintaticamente válido.
Localizado em um estágio ou repositório Git.
Capaz de processar instruções SQL sintaticamente válidas.
A criação de modelos permite estruturas de controle e parametrização mais flexíveis usando variáveis de ambiente. Por exemplo, você pode usar um modelo para escolher dinamicamente o destino de implantação dos objetos definidos no script. Para usar um modelo para renderizar um script SQL, use a diretriz de modelagem ou adicione uma cláusula USING com pelo menos uma variável de modelo.
Diretriz de modelagem¶
Você pode usar qualquer uma das duas diretrizes de modelagem.
A diretriz recomendada usa a sintaxe SQL válida:
--!jinja
Opcionalmente, você pode usar a diretriz alternativa:
#!jinja
Nota
Somente uma marca de ordem de bytes e até 10 caracteres de espaço em branco (novas linhas, tabulações, espaços) podem ser colocados antes da diretriz. Quaisquer caracteres que vierem depois da diretriz na mesma linha serão ignorados.
Como usar conteúdo de arquivos preparados em um modelo¶
Um modelo pode carregar outros arquivos preparados diretamente por meio da SnowflakeFile API ou por meio dos recursos include, import e inheritance do Jinja2.
Os arquivos podem ser referenciados por caminhos absolutos:
{% include "@my_stage/path/to/my_template" %}
{% import "@my_stage/path/to/my_template" as my_template %}
{% extends "@my_stage/path/to/my_template" %}
{{ SnowflakeFile.open("@my_stage/path/to/my_template", 'r', require_scoped_url = False).read() }}
Include, import e extends também oferecem suporte a caminhos relativos, enquanto a API SnowflakeFile aceita URLs de arquivo Snowflake com escopo:
{% include "my_template" %}
{% import "../my_template" as my_template %}
{% extends "/path/to/my_template" %}
- Consulte também:
Sintaxe¶
EXECUTE IMMEDIATE
FROM { absoluteFilePath | relativeFilePath }
[ USING ( <key> => <value> [ , <key> => <value> [ , ... ] ] ) ]
[ DRY_RUN = { TRUE | FALSE } ]
Onde:
absoluteFilePath ::= @[ <namespace>. ]<stage_name>/<path>/<filename>relativeFilePath ::= '[ / | ./ | ../ ]<path>/<filename>'
Parâmetros obrigatórios¶
Caminho absoluto do arquivo (absoluteFilePath
)¶
namespace
Banco de dados e/ou esquema no qual está o estágio interno ou externo, na forma de
database_name.schema_name
ouschema_name
. O namespace é opcional se um banco de dados e esquema estiverem em uso atualmente para a sessão do usuário; caso contrário, ele é obrigatório.stage_name
Nome do estágio interno ou externo.
path
Caminho que diferencia maiúsculas de minúsculas para o arquivo no estágio.
filename
Nome do arquivo a ser executado. Deve conter instruções SQL sintaticamente corretas e válidas. Cada instrução deve ser separada por ponto e vírgula.
Caminho relativo do arquivo (relativeFilePath
)¶
path
Caminho relativo que diferencia maiúsculas de minúsculas para o arquivo no estágio. Caminhos relativos oferecem suporte a convenções estabelecidas, como um
/
inicial para indicar a raiz do sistema de arquivos de um estágio,./
para se referir ao diretório atual (o diretório no qual o arquivo pai está localizado) e../
para se referir ao diretório pai. Para obter mais informações, consulte Notas de uso.filename
Nome do arquivo a ser executado. Deve conter instruções SQL sintaticamente corretas e válidas. Cada instrução deve ser separada por ponto e vírgula.
Parâmetros opcionais¶
USING ( <key> => <value> [ , <key> => <value> [ , ... ] ] )
Permite que você passe um ou mais pares chave-valor que podem ser usados para parametrizar a expansão do modelo. Os pares chave-valor devem formar uma lista separada por vírgulas.
Quando a cláusula USING está presente, o arquivo é primeiro renderizado como um modelo Jinja2 antes de ser executado como um script SQL.
Onde:
key
é o nome da variável do modelo. O nome da variável do modelo pode, opcionalmente, ser colocado entre aspas duplas ("
).value
é o valor a ser atribuído à variável no modelo. Os valores da cadeia de caracteres devem ser colocados entre'
ou$$
. Para um exemplo, veja Notas de uso de modelagem.
DRY_RUN = { TRUE | FALSE }
Especifica se o arquivo renderizado deve ser visualizado sem ser executado como um script SQL.
TRUE
retorna o conteúdo do arquivo renderizado sem executar as instruções SQL.FALSE
renderiza as instruções SQL do modelo e executa essas instruções.
Padrão:
FALSE
Retornos¶
EXECUTE IMMEDIATE FROM retorna:
O resultado da última instrução no arquivo se todas as instruções forem executadas com sucesso.
A mensagem de erro, se alguma instrução no arquivo falhar.
Se houver um erro em qualquer instrução do arquivo, o comando EXECUTE IMMEDIATE FROM falhará e retornará a mensagem de erro da instrução com falha.
Nota
Se o comando EXECUTE IMMEDIATE FROM falhar e retornar uma mensagem de erro, todas as instruções no arquivo anteriores à instrução com falha foram concluídas com êxito.
Requisitos de controle de acesso¶
A função usada para executar o comando EXECUTE IMMEDIATE FROM deve ter o privilégio USAGE (estágio externo) ou READ (estágio interno) no estágio onde o arquivo está localizado.
A função usada para executar o arquivo só pode executar as instruções do arquivo para as quais possui privilégios. Por exemplo, se houver uma instrução CREATE TABLE no arquivo, a função deverá ter os privilégios necessários para criar uma tabela na conta ou a instrução falhará.
O privilégio USAGE no banco de dados e no esquema pai é necessário para executar operações em qualquer objeto de um esquema.
Para instruções sobre como criar uma função personalizada com um conjunto específico de privilégios, consulte Criação de funções personalizadas.
Para informações gerais sobre concessões de funções e privilégios para executar ações de SQL em objetos protegíveis, consulte Visão geral do controle de acesso.
Notas de uso¶
As instruções SQL em um arquivo a ser executado podem incluir instruções EXECUTE IMMEDIATE FROM:
Instruções EXECUTE IMMEDIATE FROM aninhadas podem usar caminhos de arquivo relativos.
Os caminhos relativos são avaliados em relação ao estágio e ao caminho do arquivo pai. Se o caminho relativo do arquivo começar com
/
, o caminho começará no diretório raiz do estágio que contém o arquivo pai.Para obter um exemplo, consulte Exemplos.
Caminhos de arquivos relativos devem obrigatoriamente ser colocados entre aspas simples (
'
) ou$$
.A profundidade máxima de execução para arquivos aninhados é 5.
Caminhos de arquivo absolutos podem opcionalmente ser colocados entre aspas simples (
'
) ou$$
.O arquivo a ser executado não pode ter tamanho maior que 10MB.
O arquivo a ser executado deve estar codificado em UTF-8.
O arquivo a ser executado deve estar descompactado. Se você usar o comando PUT para carregar um arquivo para um estágio interno, deverá definir explicitamente o parâmetro AUTO_COMPRESS como FALSE.
Por exemplo, carregue
my_file.sql
paramy_stage
:PUT file://~/sql/scripts/my_file.sql @my_stage/scripts/ AUTO_COMPRESS=FALSE;
A execução de todos os arquivos em um diretório não é suportada. Por exemplo,
EXECUTE IMMEDIATE FROM @stage_name/scripts/
resulta em um erro.
Notas de uso de modelagem¶
Nomes de variáveis em modelos diferenciam maiúsculas de minúsculas.
O nome da variável do modelo pode ser opcionalmente colocado entre aspas duplas. Incluir o nome da variável pode ser útil se alguma palavras-chave reservada for usada como nome de variáveis.
Os seguintes tipos de parâmetros são suportados na cláusula USING:
Cadeia de caracteres. Deve ser incluído por
'
ou$$
. Por exemplo,USING (a => 'a', b => $$b$$)
.Número (decimal e inteiro). Por exemplo,
USING (a => 1, b => -1.23)
.Booleano. Por exemplo,
USING (a => TRUE, b => FALSE)
.NULL. Por exemplo,
USING (a => NULL)
.Nota
O mecanismo de modelagem Jinja2 interpreta um valor NULL como o tipo NoneType de Python.
Variáveis de sessão. Por exemplo,
USING (a => $var)
. Somente variáveis de sessão que contenham valores de tipos de dados suportados são permitidas.Variáveis de vinculação. Por exemplo,
USING (a => :var)
. Somente variáveis de vinculação que contenham valores de tipos de dados suportados são permitidas. Você pode usar variáveis de vinculação para passar argumentos de procedimento armazenado para um modelo.
Os arquivos nos estágios do repositório ou em Snowflake Native Apps não podem ser acessados a partir do modelo.
O tamanho máximo do resultado para renderização do modelo é 100.000 bytes.
Os modelos são renderizados usando o mecanismo de criação de modelos Jinja2 versão 3.1.4.
Solução de problemas de EXECUTE IMMEDIATE FROM¶
Esta seção contém alguns erros comuns que resultam de uma instrução EXECUTE IMMEDIATE FROM e como você pode resolvê-los.
Erros de arquivo¶
Erro |
001501 (02000): File '<directory_name>' not found in stage '<stage_name>'.
|
---|---|
Causa |
Existem várias causas para este erro:
|
Solução |
Verifique o nome do arquivo e confirme se ele existe. A execução de todos os arquivos em um diretório não é suportada. |
Erro |
001503 (42601): Relative file references like '<filename.sql>' cannot be used in top-level EXECUTE IMMEDIATE calls.
|
---|---|
Causa |
A instrução foi executada usando um caminho de arquivo relativo fora de uma execução de arquivo. |
Solução |
Um caminho de arquivo relativo só pode ser usado em instruções EXECUTE IMMEDIATE FROM em um arquivo. Use o caminho absoluto do arquivo para o arquivo. Para obter mais informações, consulte Notas de uso. |
Erro |
001003 (42000): SQL compilation error: syntax error line <n> at position <m> unexpected '<string>'.
|
---|---|
Causa |
O arquivo contém erros de sintaxe SQL. |
Solução |
Corrija os erros de sintaxe no arquivo e reenvie o arquivo para o estágio. |
Erros de estágio¶
Erro |
002003 (02000): SQL compilation error: Stage '<stage_name>' does not exist or not authorized.
|
---|---|
Causa |
O estágio não existe ou você não tem acesso ao estágio. |
Solução |
|
Erros de controle de acesso¶
Erro |
003001 (42501): Uncaught exception of type 'STATEMENT_ERROR' in file <file_name> on line <n> at position <m>:
SQL access control error: Insufficient privileges to operate on schema '<schema_name>'
|
---|---|
Causa |
A função usada para executar a instrução não possui os privilégios necessários para executar algumas ou todas as instruções no arquivo. |
Solução |
Use uma função que tenha os privilégios apropriados para executar as instruções no arquivo. Para obter mais informações, consulte Requisitos de controle de acesso. |
Consulte também: Erros de estágio.
Erros de modelagem¶
Erro |
001003 (42000): SQL compilation error:
syntax error line [n] at position [m] unexpected '{'.
|
---|---|
Causa |
O arquivo contém construções de modelos (por exemplo, |
Solução |
Adicione uma diretriz de modelagem ou reexecute a instrução com a cláusula USING e especifique pelo menos uma variável de modelo. |
Erro |
000005 (XX000): Python Interpreter Error:
jinja2.exceptions.UndefinedError: '<key>' is undefined
in template processing
|
---|---|
Causa |
Se alguma variável usada no modelo for deixada sem especificação na cláusula USING, ocorre um erro. |
Solução |
Verifique os nomes e o número de variáveis no modelo e atualize a cláusula USING para incluir valores para todas as variáveis de modelo. |
Erro |
001510 (42601): Unable to use value of template variable '<key>'
|
---|---|
Causa |
O valor da variável |
Solução |
Verifique se você está usando um tipo de parâmetro suportado para o valor da variável de modelo. Para obter mais informações, consulte o Notas de uso de modelagem. |
Erro |
001518 (42601): Size of expanded template exceeds limit of 100,000 bytes.
|
---|---|
Causa |
O tamanho do modelo renderizado excede o limite atual. |
Solução |
Divida seu arquivo de modelo em vários modelos menores e adicione um novo script para executá-los sequencialmente, enquanto passa variáveis de modelo aos scripts aninhados. |
Exemplos¶
Exemplo básico¶
Este exemplo executa o arquivo create-inventory.sql
localizado no estágio my_stage
.
Crie um arquivo denominado
create-inventory.sql
com as seguintes instruções:CREATE OR REPLACE TABLE my_inventory( sku VARCHAR, price NUMBER ); EXECUTE IMMEDIATE FROM './insert-inventory.sql'; SELECT sku, price FROM my_inventory ORDER BY price DESC;
Crie um arquivo denominado
insert-inventory.sql
com as seguintes instruções:INSERT INTO my_inventory VALUES ('XYZ12345', 10.00), ('XYZ81974', 50.00), ('XYZ34985', 30.00), ('XYZ15324', 15.00);
Crie um estágio interno
my_stage
:CREATE STAGE my_stage;
Carregue dois arquivos locais para o estágio usando o comando PUT:
PUT file://~/sql/scripts/create-inventory.sql @my_stage/scripts/ AUTO_COMPRESS=FALSE; PUT file://~/sql/scripts/insert-inventory.sql @my_stage/scripts/ AUTO_COMPRESS=FALSE;
Execute o script
create-inventory.sql
localizado emmy_stage
:EXECUTE IMMEDIATE FROM @my_stage/scripts/create-inventory.sql;
Retorna:
+----------+-------+ | SKU | PRICE | |----------+-------| | XYZ81974 | 50 | | XYZ34985 | 30 | | XYZ15324 | 15 | | XYZ12345 | 10 | +----------+-------+
Um exemplo de modelo simples¶
Crie um arquivo de modelo
setup.sql
com duas variáveis e a diretriz de modelagem:--!jinja CREATE SCHEMA {{env}}; CREATE TABLE RAW (COL OBJECT) DATA_RETENTION_TIME_IN_DAYS = {{retention_time}};
Crie um estágio — opcional se você já tiver um estágio para o qual possa enviar arquivos.
Por exemplo, crie um estágio interno no Snowflake:
CREATE STAGE my_stage;
Carregue o arquivo em seu estágio.
Por exemplo, use o comando PUT do seu ambiente local para fazer upload do arquivo
setup.sql
para o estágiomy_stage
:PUT file://path/to/setup.sql @my_stage/scripts/ AUTO_COMPRESS=FALSE;
Execute o arquivo
setup.sql
:EXECUTE IMMEDIATE FROM @my_stage/scripts/setup.sql USING (env=>'dev', retention_time=>0);
Exemplo de modelo com macros, condicionais, loops e importações¶
Crie um arquivo de modelo que contenha uma definição de macro.
Por exemplo, crie um arquivo
macros.jinja
no seu ambiente local:{%- macro get_environments(deployment_type) -%} {%- if deployment_type == 'prod' -%} {{ "prod1,prod2" }} {%- else -%} {{ "dev,qa,staging" }} {%- endif -%} {%- endmacro -%}
Crie um arquivo de modelo e adicione a diretiva de modelo (
--!jinja2
) na parte superior do arquivo.Após a diretiva de modelo, adicione uma instrução
import
para importar a macro definida no arquivo que você criou na etapa anterior. Por exemplo, crie um arquivosetup-env.sql
no seu ambiente local:--!jinja2 {% from "macros.jinja" import get_environments %} {%- set environments = get_environments(DEPLOYMENT_TYPE).split(",") -%} {%- for environment in environments -%} CREATE DATABASE {{ environment }}_db; USE DATABASE {{ environment }}_db; CREATE TABLE {{ environment }}_orders ( id NUMBER, item VARCHAR, quantity NUMBER); CREATE TABLE {{ environment }}_customers ( id NUMBER, name VARCHAR); {% endfor %}
Crie um estágio — opcional se você já tiver um estágio para o qual possa enviar arquivos.
Por exemplo, crie um estágio interno no Snowflake:
CREATE STAGE my_stage;
Carregue o arquivo em seu estágio.
Por exemplo, use o comando PUT em seu ambiente local para fazer o upload dos arquivos
setup-env.sql
emacros.jinja
para o estágiomy_stage
:PUT file://path/to/setup-env.sql @my_stage/scripts/ AUTO_COMPRESS=FALSE; PUT file://path/to/macros.jinja @my_stage/scripts/ AUTO_COMPRESS=FALSE;
Visualize as instruções SQL renderizadas pelo modelo para verificar se há algum problema com seu código Jinja2:
EXECUTE IMMEDIATE FROM @my_stage/scripts/setup-env.sql USING (DEPLOYMENT_TYPE => 'prod') DRY_RUN = TRUE;
Retorna:
+----------------------------------+ | rendered file contents | |----------------------------------| | --!jinja2 | | CREATE DATABASE prod1_db; | | USE DATABASE prod1_db; | | CREATE TABLE prod1_orders ( | | id NUMBER, | | item VARCHAR, | | quantity NUMBER); | | CREATE TABLE prod1_customers ( | | id NUMBER, | | name VARCHAR); | | CREATE DATABASE prod2_db; | | USE DATABASE prod2_db; | | CREATE TABLE prod2_orders ( | | id NUMBER, | | item VARCHAR, | | quantity NUMBER); | | CREATE TABLE prod2_customers ( | | id NUMBER, | | name VARCHAR); | | | +----------------------------------+
Execute o arquivo
setup-env.sql
:EXECUTE IMMEDIATE FROM @my_stage/scripts/setup-env.sql USING (DEPLOYMENT_TYPE => 'prod');