Literais e variáveis como identificadores

Nas instruções SQL do Snowflake, além de se referir a objetos pelo nome (consulte Requisitos para identificadores), você também pode usar um literal de cadeia de caracteres, variável de sessão, variável de vinculação ou variável de Script Snowflake para se referir a um objeto. Por exemplo, você pode usar uma variável de sessão que está definida para o nome de uma tabela na cláusula FROM de uma instrução SELECT. Para usar um nome de objeto especificado em um literal ou variável, use IDENTIFIER().

Usar IDENTIFIER() para identificar objetos de banco de dados é uma prática recomendada porque pode tornar o código mais reutilizável e ajudar a evitar riscos de injeção SQL.

Sintaxe

IDENTIFIER( { string_literal | session_variable | bind_variable | snowflake_scripting_variable } )
Copy
string_literal

Cadeia de caracteres que identifica o nome do objeto:

  • A cadeia de caracteres deve ser delimitada por aspas simples ('name') ou deve começar com um cifrão ($name).

  • O literal de cadeia de caracteres pode ser um nome de objeto totalmente qualificado (por exemplo, 'db_name.schema_name.object_name' ou $db_name.schema_name.object_name).

session_variable

A variável SQL que foi definida para a sessão.

bind_variable

Uma variável de vinculação, na forma de ? ou :variable, que pode ser usada por clientes/interfaces programáticas que aceitam vinculação (JDBC, ODBC, Python etc.).

snowflake_scripting_variable

Uma variável Script Snowflake que foi definida.

Notas de uso

  • Você pode usar literais e variáveis (sessão ou vinculação) em alguns casos quando for necessário identificar um objeto pelo nome (consultas, DML, DDL etc.).

  • Você pode usar variáveis de vinculação para identificadores de objeto e variáveis de vinculação para valores na mesma consulta.

  • Em uma cláusula FROM, você pode usar TABLE( { string_literal | session_variable | bind_variable | snowflake_scripting_variable } ) como sinônimo de IDENTIFIER( { string_literal | session_variable | bind_variable | snowflake_scripting_variable } ).

  • Embora IDENTIFIER() utilize a sintaxe de uma função, ela não é uma função verdadeira e não é retornada por comandos como SHOW FUNCTIONS.

Exemplos

Os exemplos a seguir usam IDENTIFIER().

Como usar IDENTIFIER() com literais de cadeia de caracteres

Esses exemplos mostram como fazer referência a um objeto quando um literal de cadeia de caracteres contém o identificador do objeto.

Crie um banco de dados:

CREATE OR REPLACE DATABASE IDENTIFIER('my_db');
Copy
+--------------------------------------+
| status                               |
|--------------------------------------|
| Database MY_DB successfully created. |
+--------------------------------------+

Criação de um esquema:

CREATE OR REPLACE SCHEMA IDENTIFIER('my_schema');
Copy
+----------------------------------------+
| status                                 |
|----------------------------------------|
| Schema MY_SCHEMA successfully created. |
+----------------------------------------+

Crie uma tabela usando um nome de tabela que não diferencia maiúsculas de minúsculas, especificado em uma cadeia de caracteres com o nome totalmente qualificado:

CREATE OR REPLACE TABLE IDENTIFIER('my_db.my_schema.my_table') (c1 number);
Copy
+--------------------------------------+
| status                               |
|--------------------------------------|
| Table MY_TABLE successfully created. |
+--------------------------------------+

Crie uma tabela usando um nome de tabela que diferencia maiúsculas de minúsculas especificado em uma cadeia de caracteres entre aspas duplas:

CREATE OR REPLACE TABLE IDENTIFIER('"my_table"') (c1 number);
Copy
+--------------------------------------+
| status                               |
|--------------------------------------|
| Table my_table successfully created. |
+--------------------------------------+

Mostre as tabelas em um esquema:

SHOW TABLES IN SCHEMA IDENTIFIER('my_schema');
Copy
+-------------------------------+----------+---------------+-------------+-------+---------+---------+
| created_on                    | name     | database_name | schema_name | kind  | comment | ...     |
|-------------------------------+----------+---------------+-------------+-------+---------+---------|
| 2024-07-03 08:55:11.992 -0700 | MY_TABLE | MY_DB         | MY_SCHEMA   | TABLE |         | ...     |
| 2024-07-03 08:56:00.604 -0700 | my_table | MY_DB         | MY_SCHEMA   | TABLE |         | ...     |
+-------------------------------+----------+---------------+-------------+-------+---------+---------+

Como usar IDENTIFIER() com variáveis de sessão

Esses exemplos mostram como usar uma variável de sessão que tem um nome de tabela ou nome de esquema.

Defina uma variável de sessão para um nome de esquema:

SET schema_name = 'my_db.my_schema';
Copy

Defina uma variável de sessão para um nome de tabela:

SET table_name = 'my_table';
Copy

Especifique o esquema para a sessão atual:

USE SCHEMA IDENTIFIER($schema_name);
Copy

Insira os valores em uma tabela:

INSERT INTO IDENTIFIER($table_name) VALUES (1), (2), (3);
Copy

Consulte uma tabela:

SELECT * FROM IDENTIFIER($table_name) ORDER BY 1;
Copy
+----+
| C1 |
|----|
|  1 |
|  2 |
|  3 |
+----+

Este exemplo mostra como usar uma variável de sessão com um nome de função.

  1. Crie a função speed_of_light:

    CREATE FUNCTION speed_of_light() 
    RETURNS INTEGER
    AS
      $$
      299792458
      $$;
    
    Copy
  2. Chame a função pelo nome:

    SELECT speed_of_light();
    
    Copy
    +------------------+
    | SPEED_OF_LIGHT() |
    |------------------|
    |        299792458 |
    +------------------+
    
  3. Chame a função usando a sintaxe IDENTIFIER():

    SET my_function_name = 'speed_of_light';
    
    Copy
    SELECT IDENTIFIER($my_function_name)();
    
    Copy
    +---------------------------------+
    | IDENTIFIER($MY_FUNCTION_NAME)() |
    |---------------------------------|
    |                       299792458 |
    +---------------------------------+
    

Como usar IDENTIFIER() com variáveis de ligação

Esses exemplos mostram como usar variáveis de vinculação para identificar objetos.

Este exemplo mostra como vincular um nome de função em JDBC. A função é denominada speed_of_light.

String sql_command;

// Create a Statement object to use later.
System.out.println("Create JDBC statement.");
Statement statement = connection.createStatement();
System.out.println("Create function.");
sql_command = "CREATE FUNCTION speed_of_light() RETURNS INTEGER AS $$ 299792458 $$";
statement.execute(sql_command);

System.out.println("Create prepared statement.");
sql_command = "SELECT IDENTIFIER(?)()";
PreparedStatement ps = connection.prepareStatement(sql_command);
// Bind
ps.setString(1, "speed_of_light");
ResultSet rs = ps.executeQuery();
if (rs.next()) {
  System.out.println("Speed of light (m/s) = " + rs.getInt(1));
}
Copy

Os exemplos a seguir mostram uma variedade de instruções SQL que podem usar vinculação, e uma variedade de objetos de banco de dados que podem ser vinculados (incluindo nomes de esquemas e nomes de tabelas):

USE SCHEMA IDENTIFIER(?);

CREATE OR REPLACE TABLE IDENTIFIER(?) (c1 NUMBER);

INSERT INTO IDENTIFIER(?) values (?), (?), (?);

SELECT t2.c1
  FROM IDENTIFIER(?) AS t1,
       IDENTIFIER(?) AS t2
  WHERE t1.c1 = t2.c1 AND t1.c1 > (?);

DROP TABLE IDENTIFIER(?);
Copy

Como usar IDENTIFIER() com variáveis Snowflake Scripting

Este exemplo mostra como usar uma variável Snowflake Scripting para um nome de tabela em uma instrução SELECT:

BEGIN
  LET res RESULTSET := (SELECT COUNT(*) AS COUNT FROM IDENTIFIER(:table_name));
  ...
Copy