Zeichenfolgenliterale / Sitzungsvariablen / Bindungsvariablen als Bezeichner

In Snowflake können Bezeichner Objekte nicht nur namentlich identifizieren (wie in Anforderungen an Bezeichner beschrieben), sie können auch mit Zeichenfolgenliteralen, Sitzungsvariablen oder Bindungsvariablen über das Schlüsselwort IDENTIFIER angegeben werden.

Syntax

IDENTIFIER( { string_literal | session_variable | bind_variable } )
Zeichenfolgenliteral

Zeichenfolge, die den Namen des Objekts identifiziert:

  • Die Zeichenfolge muss entweder in einfache Anführungszeichen ('Name') eingeschlossen sein oder mit einem Dollarzeichen ($Name) beginnen.

  • Das Zeichenfolgenliteral kann ein vollständig qualifizierter Objektname sein (z. B. 'Datenbankname.Schemaname.Objektname' oder $Datenbankname.Schemaname.Objektname).

Sitzungsvariable

Eine SQL-Variable, die für die Sitzung festgelegt wurde.

Bindungsvariable

Eine Bindungsvariable in Form von ? oder :Variable, die von Clients oder Programmierschnittstellen verwendet werden kann, die Bindungen unterstützen (JDBC, ODBC, Python usw.).

Nutzungshinweise

  • Literale und Variablen (Sitzung oder Bindung) können überall dort verwendet werden, wo ein Objekt durch seinen Namen identifiziert werden kann (Abfragen, DML, DDL usw.).

  • Objektbezeichnerbindungen können in der gleichen Abfrage mit Wertbindungen verwendet werden.

Beispiele

Zeichenfolgenliterale:

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              |
+---------------------------------+----------+---------------+-------------+-------+---------+------------+------+-------+----------+----------------+

Sitzungsvariablen:

Hier wird gezeigt, wie eine Sitzungsvariable mit einem Tabellennamen oder Schemanamen verwendet wird:

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  |
+----+

Hier wird gezeigt, wie eine Sitzungsvariable mit einem Funktionsnamen verwendet wird. Die Funktion heißt speed_of_light.

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

Rufen Sie die Funktion beim Namen auf:

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

Rufen Sie die Funktion mit der IDENTIFIER()-Syntax auf:

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

Bindungsvariablen:

Dieses Beispiel zeigt, wie ein Funktionsname in JDBC gebunden wird. Die Funktion heißt 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));
}

Die folgenden Beispiele zeigen eine Vielzahl von SQL-Anweisungen, die eine Bindung verwenden können, und eine Vielzahl von Datenbankobjekten, die gebunden werden können (einschließlich Schemanamen und Tabellennamen):

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(?);