Littéraux de chaîne / Variables de session / Variables de liaison comme identificateurs

Dans Snowflake, en plus d’identifier des objets par leur nom (comme détaillé dans Exigences relatives à l’identificateur), des identificateurs peuvent également être spécifiés avec des littéraux de chaînes, des variables de session ou des variables de liaison, en utilisant le mot-clé IDENTIFIER.

Syntaxe

IDENTIFIER( { string_literal | session_variable | bind_variable } )
litéral_chaine

Chaîne identifiant le nom de l’objet :

  • La chaîne doit être délimitée par des guillemets simples ('nom') ou commencer par un signe dollar ($nom).

  • Le littéral de chaîne peut être un nom d’objet complet (par exemple 'nom_bd.nom_schéma.nom_objet' ou $nom_bd.nom_schéma.nom_objet).

variable_session

Une variable SQL qui a été définie pour la session.

variable_liaison

Variable de liaison, sous la forme de ? ou :variable, qui peut être utilisée par des interfaces client/programme qui prennent en charge la liaison (JDBC, ODBC, Python, etc.).

Notes sur l’utilisation

  • Des littéraux et des variables (session ou liaison) peuvent être utilisés partout où un objet peut être identifié par son nom (requêtes, DML, DDL, etc.).

  • Les liaisons d’identificateurs d’objets peuvent être utilisées dans la même requête que des liaisons de valeurs.

Exemples

Littéraux de chaînes :

create or replace database identifier('my_db');

+--------------------------------------+
|                status                |
+--------------------------------------+
| Database MY_DB successfully created. |
+--------------------------------------+

create or replace schema identifier('my_schema');

+----------------------------------------+
|                 status                 |
+----------------------------------------+
| Schema MY_SCHEMA successfully created. |
+----------------------------------------+

-- case-insensitive table name specified in a string containing the fully-qualified name
create or replace table identifier('my_db.my_schema.my_table') (c1 number);

+--------------------------------------+
|                status                |
+--------------------------------------+
| Table MY_TABLE successfully created. |
+--------------------------------------+

-- case-sensitive table name specified in a double-quoted string
create or replace table identifier('"my_table"') (c1 number);

+--------------------------------------+
|                status                |
+--------------------------------------+
| Table my_table successfully created. |
+--------------------------------------+

show tables in schema identifier('my_schema');

+---------------------------------+----------+---------------+-------------+-------+---------+------------+------+-------+----------+----------------+
|           created_on            |   name   | database_name | schema_name | kind  | comment | cluster_by | rows | bytes |  owner   | retention_time |
+---------------------------------+----------+---------------+-------------+-------+---------+------------+------+-------+----------+----------------+
| Tue, 05 Dec 2017 12:16:18 -0800 | MY_TABLE | MY_DB         | MY_SCHEMA   | TABLE |         |            | 0    | 0     | SYSADMIN | 1              |
| Tue, 05 Dec 2017 12:16:59 -0800 | my_table | MY_DB         | MY_SCHEMA   | TABLE |         |            | 0    | 0     | SYSADMIN | 1              |
+---------------------------------+----------+---------------+-------------+-------+---------+------------+------+-------+----------+----------------+

Variables de session :

Cela montre comment utiliser une variable de session qui a un nom de table ou un nom de schéma :

set schema_name = 'my_db.my_schema';

set table_name = 'my_table';

use schema identifier($schema_name);

insert into identifier ($table_name) values (1), (2), (3);

select * from identifier($table_name) order by 1;

+----+
| C1 |
+----+
| 1  |
| 2  |
| 3  |
+----+

Cela montre comment utiliser une variable de session qui a un nom de fonction. La fonction s’appelle speed_of_light.

CREATE FUNCTION speed_of_light() 
RETURNS INTEGER
AS
    $$
    186250
    $$;

Appelez la fonction par son nom :

SELECT SPEED_OF_LIGHT();
+------------------+
| SPEED_OF_LIGHT() |
|------------------|
|           186250 |
+------------------+

Appelez la fonction en utilisant la syntaxe IDENTIFIER() :

SET MY_FUNCTION_NAME = 'speed_of_light';
SELECT IDENTIFIER($MY_FUNCTION_NAME)();
+---------------------------------+
| IDENTIFIER($MY_FUNCTION_NAME)() |
|---------------------------------|
|                          186250 |
+---------------------------------+

Variables de liaison :

Cet exemple montre comment lier un nom de fonction dans JDBC. La fonction s’appelle 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 $$ 186250 $$";
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 (MPH) = " + rs.getInt(1));
}

Les exemples suivants présentent une variété d’instructions SQL qui peuvent utiliser la liaison et une variété d’objets de base de données qui peuvent être liés (y compris les noms de schéma et de table) :

use schema identifier(?);

create or replace table identifier(?) (c1 number);

insert into table identifier(?) values (?), (?), (?);

select t2.c1 from identifier(?) as t1, identifier(?) as t2 where t1.c1 = t2.c1 and t1.c1 > (?);

drop table identifier(?);