Variáveis SQL

Este tópico descreve como definir e usar variáveis SQL em sessões no Snowflake.

Neste tópico:

Visão geral

O Snowflake oferece suporte a variáveis SQL declaradas pelo usuário. Elas têm muitos usos, como o armazenamento de configurações de ambiente específicas de aplicativos.

Identificadores de variáveis

As variáveis SQL são identificadas globalmente usando nomes que não diferenciam maiúsculas e minúsculas.

DDL de variáveis

O Snowflake fornece os seguintes comandos DDL para usar as variáveis SQL:

Inicialização de variáveis

As variáveis podem ser definidas executando a instrução SQL SET ou definindo as variáveis na cadeia de caracteres de conexão quando você se conecta ao Snowflake.

O tamanho da cadeia de caracteres ou das variáveis binárias é limitado a 256 bytes.

Uso de SQL para inicializar variáveis em uma sessão

As variáveis podem ser inicializadas em SQL usando o comando SET. O tipo de dados da variável é derivado do tipo de dados do resultado da expressão avaliada.

SET MY_VARIABLE=10;
SET MY_VARIABLE='example';
Copy

Múltiplas variáveis podem ser inicializadas na mesma instrução, reduzindo assim o número de comunicações de ida e volta com o servidor.

SET (VAR1, VAR2, VAR3)=(10, 20, 30);
SET (VAR1, VAR2, VAR3)=(SELECT 10, 20, 30);
Copy

Definição de variáveis na conexão

Além de usar SET para definir variáveis dentro de uma sessão, as variáveis podem ser passadas como argumentos na cadeia de caracteres de conexão usada para inicializar uma sessão no Snowflake. Isso é especialmente útil quando se usa ferramentas em que a especificação da cadeia de caracteres de conexão é a única personalização possível.

Por exemplo, usando o driver Snowflake JDBC, você pode definir propriedades adicionais de conexão que serão interpretadas como parâmetros. Observe que a API JDBC requer que as variáveis SQL sejam cadeia de caracteres.

// build connection properties
Properties properties = new Properties();

// Required connection properties
properties.put("user"    ,  "jsmith"      );
properties.put("password",  "mypassword");
properties.put("account" ,  "myaccount");

// Set some additional variables.
properties.put("$variable_1", "some example");
properties.put("$variable_2", "1"           );

// create a new connection
String connectStr = "jdbc:snowflake://localhost:8080";

// Open a connection under the snowflake account and enable variable support
Connection con = DriverManager.getConnection(connectStr, properties);
Copy

Uso de variáveis em SQL

Variáveis podem ser usadas no Snowflake em qualquer lugar onde uma constante literal seja permitida, exceto onde indicado na documentação. Para distingui-las dos valores de vinculação e nomes de colunas, todas as variáveis devem ser prefixadas com um sinal $.

Por exemplo:

SET (MIN, MAX)=(40, 70);

SELECT $MIN;

SELECT AVG(SALARY) FROM EMP WHERE AGE BETWEEN $MIN AND $MAX;
Copy

Nota

Como o sinal $ é o prefixo usado para identificar variáveis em instruções SQL, ele é tratado como um caractere especial quando usado em identificadores. Os identificadores (nomes de bancos de dados, nomes de tabelas, nomes de colunas etc.) não podem começar com caracteres especiais, a menos que o nome inteiro esteja entre aspas duplas. Para obter mais informações, consulte Identificadores de objetos.

As variáveis também podem conter nomes de identificadores, como nomes de tabelas. Para usar uma variável como identificador, você deve delimitá-la com IDENTIFIER(), por exemplo IDENTIFIER($MY_VARIABLE). Veja alguns exemplos abaixo:

CREATE TABLE IDENTIFIER($MY_TABLE_NAME) (i INTEGER);
INSERT INTO IDENTIFIER($MY_TABLE_NAME) (i) VALUES (42);
Copy
SELECT * FROM IDENTIFIER($MY_TABLE_NAME);
Copy
DROP TABLE IDENTIFIER($MY_TABLE_NAME);
Copy

No contexto de uma cláusula FROM, você pode delimitar o nome da variável com TABLE(), como mostrado abaixo:

SELECT * FROM TABLE($MY_TABLE_NAME);
+----+
|  I |
|----|
| 42 |
+----+
Copy

Para obter mais informações sobre IDENTIFIER(), consulte Literais e variáveis como identificadores.

Exibição das variáveis para a sessão

Para ver todas as variáveis definidas na sessão atual, use o comando SHOW VARIABLES:

SET (MIN, MAX)=(40, 70);

+----------------------------------+
| status                           |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+

SHOW VARIABLES;

+-------------+---------------------------------+---------------------------------+------+-------+-------+---------+
|  session_id | created_on                      | updated_on                      | name | value | type  | comment |
|-------------+---------------------------------+---------------------------------+------+-------+-------+---------|
| 34359992326 | Fri, 21 Apr 2017 11:20:32 -0700 | Fri, 21 Apr 2017 11:20:32 -0700 | MAX  | 70    | fixed |         |
| 34359992326 | Fri, 21 Apr 2017 11:20:32 -0700 | Fri, 21 Apr 2017 11:20:32 -0700 | MIN  | 40    | fixed |         |
+-------------+---------------------------------+---------------------------------+------+-------+-------+---------+
Copy

Funções das variáveis de sessão

As seguintes funções de conveniência são fornecidas para manipulação de variáveis de sessão a fim de oferecer suporte à compatibilidade com outros sistemas de banco de dados e emitir SQL por meio de ferramentas que não aceitam a sintaxe $ para acessar variáveis. Note que todas essas funções aceitam e retornam valores de variáveis de sessão como cadeias de caracteres:

  • SYS_CONTEXT e SET_SYS_CONTEXT

  • SESSION_CONTEXT e SET_SESSION_CONTEXT

  • GETVARIABLE e SETVARIABLE

Aqui estão exemplos da utilização de GETVARIABLE. Primeiro, defina uma variável usando SET:

SET var_artist_name = 'Jackson Browne';
Copy
+----------------------------------+
| status                           |
+----------------------------------+
| Statement executed successfully. |
+----------------------------------+

Retorne o valor da variável:

SELECT GETVARIABLE('var_artist_name');
Copy

Neste exemplo, a saída é NULL porque o Snowflake armazena variáveis com todas as letras maiúsculas.

Atualize o uso de letras maiúsculas e minúsculas:

SELECT GETVARIABLE('VAR_ARTIST_NAME');
Copy
+--------------------------------+
| GETVARIABLE('VAR_ARTIST_NAME') |
+--------------------------------+
| Jackson Browne                 |
+--------------------------------+

Você pode usar o nome da variável em uma cláusula WHERE, por exemplo:

SELECT album_title
  FROM albums
  WHERE artist = $VAR_ARTIST_NAME;
Copy

Descarte/remoção de variáveis

Variáveis SQL são privadas para uma sessão. Quando uma sessão do Snowflake é encerrada, todas as variáveis criadas durante a sessão são descartadas. Isso significa que ninguém pode acessar variáveis definidas pelo usuário que tenham sido definidas em outra sessão, e quando a sessão é encerrada, essas variáveis expiram.

Além disso, as variáveis sempre podem ser explicitamente destruídas usando o comando UNSET.

Por exemplo:

UNSET MY_VARIABLE;
Copy