식별자로서의 리터럴과 변수

Snowflake SQL 문에서는 이름으로 오브젝트를 지칭하는 것 외에(식별자 요구 사항 참조), 문자열 리터럴, 세션 변수, 바인드 변수 또는 Snowflake Scripting 변수 를 사용하여 오브젝트를 지칭할 수도 있습니다. 예를 들어 SELECT 문의 FROM 절에서 테이블 이름으로 설정된 세션 변수를 사용할 수 있습니다. 리터럴이나 변수에 지정된 오브젝트 이름을 사용하려면 IDENTIFIER()를 사용하십시오.

IDENTIFIER()를 사용하여 데이터베이스 오브젝트를 식별하는 것이 모범 사례인데, 코드의 재사용성을 높이고 SQL 주입 위험을 방지하는 데 도움이 될 수 있기 때문입니다.

구문

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

오브젝트의 이름을 식별하는 문자열:

  • 문자열은 작은따옴표로 묶거나('name') 달러 기호로 시작해야 합니다($name).

  • 문자열 리터럴은 정규화된 오브젝트 이름(예: 'db_name.schema_name.object_name' 또는 $db_name.schema_name.object_name)일 수 있습니다.

session_variable

세션에 대해 설정된 SQL 변수 입니다.

bind_variable

? 또는 변수 :variable 의 형식으로 된 바인드 변수 로, 바인딩을 지원하는 클라이언트/프로그래밍 인터페이스(JDBC, ODBC, Python 등)에서 이런 변수를 사용할 수 있습니다.

snowflake_scripting_variable

설정된 Snowflake Scripting 변수 입니다.

사용법 노트

  • 이름(쿼리, DML, DDL 등)으로 오브젝트를 식별해야 할 때, 경우에 따라 리터럴과 변수(세션 또는 바인드)를 사용할 수 있습니다.

  • 오브젝트 식별자의 바인드 변수와 값의 바인드 변수를 같은 쿼리에 사용할 수 있습니다.

  • FROM 절에서 TABLE( { string_literal | session_variable | bind_variable | snowflake_scripting_variable } )IDENTIFIER( { string_literal | session_variable | bind_variable | snowflake_scripting_variable } ) 동의어로 사용할 수 있습니다.

  • IDENTIFIER()는 함수의 구문을 사용하지만, 실제 함수가 아니며 SHOW FUNCTIONS 등의 명령에 의해 반환되지 않습니다.

다음 예에서는 IDENTIFIER()를 사용합니다.

문자열 리터럴과 함께 IDENTIFIER() 사용하기

다음 예에서는 문자열 리터럴에 오브젝트 식별자가 포함되어 있을 때 오브젝트를 참조하는 방법을 보여줍니다.

데이터베이스를 만듭니다.

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

스키마를 만듭니다.

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

정규화된 이름을 포함하는 문자열에 지정된 대/소문자를 구분하지 않는 테이블 이름을 사용하여 테이블을 만듭니다.

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

큰따옴표로 묶은 문자열로 지정된 대/소문자를 구분하는 테이블 이름을 사용하여 테이블을 만듭니다.

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

스키마에서 테이블을 표시합니다.

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

세션 변수와 함께 IDENTIFIER() 사용하기

다음 예에서는 테이블 이름 또는 스키마 이름을 가진 세션 변수 의 사용법을 보여줍니다.

스키마 이름에 대한 세션 변수를 설정합니다.

SET schema_name = 'my_db.my_schema';
Copy

테이블 이름에 대한 세션 변수를 설정합니다.

SET table_name = 'my_table';
Copy

현재 세션에 대한 스키마를 지정합니다.

USE SCHEMA IDENTIFIER($schema_name);
Copy

테이블에 값을 삽입합니다.

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

테이블을 쿼리합니다.

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

다음 예에서는 함수 이름을 가진 세션 변수의 사용법을 보여줍니다.

  1. speed_of_light 함수를 만듭니다.

    CREATE FUNCTION speed_of_light() 
    RETURNS INTEGER
    AS
      $$
      299792458
      $$;
    
    Copy
  2. 이름으로 함수를 호출합니다.

    SELECT speed_of_light();
    
    Copy
    +------------------+
    | SPEED_OF_LIGHT() |
    |------------------|
    |        299792458 |
    +------------------+
    
  3. IDENTIFIER() 구문을 사용해 함수를 호출합니다.

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

바인드 변수가 포함된 IDENTIFIER() 사용하기

다음 예에서는 바인드 변수 를 사용하여 오브젝트를 식별하는 방법을 보여줍니다.

이 예에서는 JDBC에서 함수 이름을 바인딩하는 방법을 보여줍니다. 이 함수는 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

다음 예에서는 바인딩을 사용할 수 있는 다양한 SQL 문과 바인딩할 수 있는 다양한 데이터베이스 오브젝트(스키마 이름과 테이블 이름 포함)를 보여줍니다.

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

Snowflake Scripting 변수를 포함한 IDENTIFIER() 사용하기

이 예에서는 SELECT 문에서 테이블 이름에 대한 Snowflake Scripting 변수 를 사용하는 방법을 보여줍니다.

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