식별자로서의 리터럴과 변수¶
Snowflake SQL 문에서는 이름으로 오브젝트를 지칭하는 것 외에(식별자 요구 사항 참조), 문자열 리터럴, 세션 변수, 바인드 변수 또는 Snowflake Scripting 변수 를 사용하여 오브젝트를 지칭할 수도 있습니다. 예를 들어 SELECT 문의 FROM 절에서 테이블 이름으로 설정된 세션 변수를 사용할 수 있습니다. 리터럴이나 변수에 지정된 오브젝트 이름을 사용하려면 IDENTIFIER()를 사용하십시오.
IDENTIFIER()를 사용하여 데이터베이스 오브젝트를 식별하는 것이 모범 사례인데, 코드의 재사용성을 높이고 SQL 주입 위험을 방지하는 데 도움이 될 수 있기 때문입니다.
구문¶
IDENTIFIER( { string_literal | session_variable | bind_variable | snowflake_scripting_variable } )
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');
+--------------------------------------+
| status |
|--------------------------------------|
| Database MY_DB successfully created. |
+--------------------------------------+
스키마를 만듭니다.
CREATE OR REPLACE SCHEMA IDENTIFIER('my_schema');
+----------------------------------------+
| status |
|----------------------------------------|
| Schema MY_SCHEMA successfully created. |
+----------------------------------------+
정규화된 이름을 포함하는 문자열에 지정된 대/소문자를 구분하지 않는 테이블 이름을 사용하여 테이블을 만듭니다.
CREATE OR REPLACE TABLE IDENTIFIER('my_db.my_schema.my_table') (c1 number);
+--------------------------------------+
| status |
|--------------------------------------|
| Table MY_TABLE successfully created. |
+--------------------------------------+
큰따옴표로 묶은 문자열로 지정된 대/소문자를 구분하는 테이블 이름을 사용하여 테이블을 만듭니다.
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 | ... |
|-------------------------------+----------+---------------+-------------+-------+---------+---------|
| 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';
테이블 이름에 대한 세션 변수를 설정합니다.
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 |
+----+
다음 예에서는 함수 이름을 가진 세션 변수의 사용법을 보여줍니다.
speed_of_light
함수를 만듭니다.CREATE FUNCTION speed_of_light() RETURNS INTEGER AS $$ 299792458 $$;
이름으로 함수를 호출합니다.
SELECT speed_of_light();
+------------------+ | SPEED_OF_LIGHT() | |------------------| | 299792458 | +------------------+
IDENTIFIER() 구문을 사용해 함수를 호출합니다.
SET my_function_name = 'speed_of_light';
SELECT IDENTIFIER($my_function_name)();
+---------------------------------+ | 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));
}
다음 예에서는 바인딩을 사용할 수 있는 다양한 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(?);
Snowflake Scripting 변수를 포함한 IDENTIFIER() 사용하기¶
이 예에서는 SELECT 문에서 테이블 이름에 대한 Snowflake Scripting 변수 를 사용하는 방법을 보여줍니다.
BEGIN LET res RESULTSET := (SELECT COUNT(*) AS COUNT FROM IDENTIFIER(:table_name)); ...