SnowConvert AI - Teradata - DDL¶
이 섹션에서는 데이터 정의 언어 요소의 변환 참조에 대한 설명서를 확인할 수 있습니다.
인덱스¶
INDEX 문을 Snowflake로 변환하기 위한 변환 참조
경고
현재 _ Create Index _ 문은 변환되지 않지만, 구문 분석 중입니다. 또한 소스 코드에 Create index 문이 있는 경우 _ Assessment Report _에서 이를 설명합니다.
Create Index의 예
Teradata 입력¶
CREATE INDEX (col1, col2, col3) ORDER BY VALUES (col2) ON table1;
CREATE INDEX my_index_name ON my_table (column1, column2);
참고
아키텍처상의 이유로 Snowflake는 인덱스를 지원하지 않으므로, SnowConvert AI는 인덱스 생성과 관련된 모든 코드를 제거합니다. Snowflake는 모든 테이블에 대해 DML 작업의 성능 속도를 높이는 데 도움이 되는 마이크로 파티션을 자동으로 생성하므로 사용자는 이러한 마이크로 파티션의 생성 및 관리에 대해 걱정할 필요가 없습니다.
일반적으로는 이 정도만으로도 쿼리 성능이 매우 우수하지만, 데이터 클러스터링 키를 생성하여 성능을 향상시킬 수 있는 방법이 있습니다. 마이크로 파티션과 데이터 클러스터링에 대한 자세한 내용은 Snowflake의 공식 페이지 에서 확인할 수 있습니다.
조인 인덱스¶
설명 ¶
SnowConvert AI에서 Teradata 조인 인덱스는 Snowflake 동적 테이블로 변환됩니다. 동적 테이블을 올바르게 구성하려면 두 가지 필수 매개 변수인 TARGET_LAG 및 WAREHOUSE를 정의해야 합니다. 구성 옵션에서 이러한 매개 변수를 지정하지 않은 경우, SnowConvert AI는 아래 예에서 볼 수 있듯이, 기본적으로 변환 중에 미리 할당된 값으로 설정됩니다.
조인 인덱스에 대한 자세한 내용을 보려면 여기 를 클릭하십시오.
동적 테이블에 필요한 매개 변수에 대한 자세한 내용을 보려면 여기 를 클릭하십시오.
샘플 소스 패턴¶
Teradata
조인 인덱스
CREATE JOIN INDEX Employee
AS
SELECT
Employee_Id,
First_Name,
Last_Name,
BirthDate,
DepartmentNo
FROM Employee
PRIMARY INDEX (First_Name);
Snowflake
동적 테이블
CREATE OR REPLACE DYNAMIC TABLE Employee
--** SSC-FDM-0031 - DYNAMIC TABLE REQUIRED PARAMETERS SET BY DEFAULT **
TARGET_LAG='1 day'
WAREHOUSE=UPDATE_DUMMY_WAREHOUSE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
AS
SELECT
Employee_Id,
First_Name,
Last_Name,
BirthDate,
DepartmentNo
FROM
Employee;
Known Issues¶
현재 알려진 오류가 감지되지 않았습니다.
스키마¶
설명 ¶
기본 구문은 동일하게 유지되므로 CREATE SCHEMA 문을 Teradata에서 Snowflake로 변환하는 것은 간단합니다.
샘플 소스 패턴¶
Teradata
조인 인덱스
CREATE SCHEMA IF EXISTS schema_name;
Snowflake
동적 테이블
CREATE SCHEMA IF EXISTS schema_name
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/23/2024" }}'
;
Known Issues¶
CREATE SCHEMA 의 WITH 속성¶
Teradata의 CREATE SCHEMA 문과 연결된 WITH 속성은 사용 가능한 동등한 기능이 없으므로 Snowflake에서 지원되지 않습니다.
Teradata
조인 인덱스
CREATE SCHEMA IF EXISTS schema_name
WITH ( PROPERTY1 = PROPERTYNAME, PROPERTY2 = PROPERTTYNAME, PROPERTY3 = PROPERTTYNAME);
Snowflake
동적 테이블
CREATE SCHEMA IF EXISTS schema_name
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/23/2024" }}'
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'SCHEMA WITH' NODE ***/!!!
WITH ( PROPERTY1 = PROPERTYNAME, PROPERTY2 = PROPERTTYNAME, PROPERTY3 = PROPERTTYNAME);
관련 EWIs¶
SSC-EWI-0073: 보류 중 함수 동등성 검토.
뷰¶
Teradata VIEW를 Snowflake로 변환하기 위한 변환 참조
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명 ¶
Teradata의 VIEW 문은 Snowflake VIEW 구문으로 변환됩니다.
Teradata VIEW 에 대한 자세한 내용은 여기 에서 확인할 수 있습니다.
샘플 소스 패턴¶
뷰 변환 생성하기¶
Teradata
뷰¶
CREATE VIEW view1 (someTable.col1, someTable.col2) AS locking row for access
SELECT
my_table.col1, my_table.col2
FROM table1 AS my_table
WHERE my_table.col1 = 'SpecificValue'
UNION ALL
SELECT other_table.col2
FROM table2 AS other_table
WHERE my_table.col2 = other_table.col2
Snowflake
뷰¶
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "table1", "table2" **
CREATE OR REPLACE VIEW view1
(
col1,
col2)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/02/2025", "domain": "no-domain-provided" }}'
AS
SELECT
my_table.col1,
my_table.col2
FROM
table1 AS my_table
WHERE
UPPER(RTRIM( my_table.col1)) = UPPER(RTRIM('SpecificValue'))
UNION ALL
SELECT
other_table.col2
FROM
table2 AS other_table
WHERE my_table.col2 = other_table.col2;
사용자 지정 스키마 태그¶
사용자 정의 스키마는 뷰 지정 앞의 설명 섹션에 <sc-view>SCHEMANAME.VIEWNAME</sc-view> 같이 스키마 값과 뷰 이름만 마침표 ‘.’로 구분된 “sc-view”라는 XML 태그를 사용하여 지정합니다.
사용자 지정 스키마가 뷰 한정자로 사용되며, 뷰의 이름과 FROM 쿼리 및 내부 쿼리에서 참조되는 모든 오브젝트가 해당 사용자 지정 스키마를 사용합니다. 따라서 이름은 같지만 사용자 지정 태그가 다른 여러 개의 뷰가 있을 수 있습니다. 예: 이름이 같은 2개의 뷰는 사용자 지정 스키마 태그 정보를 사용하여 변환을 수행합니다.
Teradata¶
뷰¶
/*<sc-view>RMSviews.EMPLOYEEB</sc-view>*/
REPLACE VIEW EMPLOYEEB AS
SELECT * FROM EMPLOYEE
WHERE AREA = "AREAB";
/*<sc-view>Views.EMPLOYEEB</sc-view>*/
REPLACE VIEW EMPLOYEEB AS
SELECT * FROM EMPLOYEE
WHERE AREA = "AREAB";
Snowflake¶
사용자 정의 스키마 이름 MySchema, 사용자 정의 데이터베이스 이름 MyDatabase 또는 변환 설정에서 사용자 정의 데이터베이스 또는 스키마를 선택하지 않은 경우에 따라 Snowflake에 대한 변환이 달라집니다.
사용자 지정 스키마¶
/*<sc-view>RMSviews.EMPLOYEEB</sc-view>*/
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "EMPLOYEE" **
CREATE OR REPLACE VIEW RMSviews.EMPLOYEEB
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
AS
SELECT
* FROM
RMSviews.EMPLOYEE
WHERE AREA = "AREAB";
/*<sc-view>Views.EMPLOYEEB</sc-view>*/
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "EMPLOYEE" **
--** SSC-FDM-0019 - SEMANTIC INFORMATION COULD NOT BE LOADED FOR Views.EMPLOYEEB. CHECK IF THE NAME IS INVALID OR DUPLICATED. **
CREATE OR REPLACE VIEW Views.EMPLOYEEB
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
AS
SELECT
* FROM
Views.EMPLOYEE
WHERE AREA = "AREAB";
사용자 지정 데이터베이스¶
/*<sc-view>RMSviews.EMPLOYEEB</sc-view>*/
CREATE OR REPLACE VIEW MyDatabase.RMSviews.EMPLOYEEB
AS
SELECT * FROM MyDatabase.RMSviews.EMPLOYEE
WHERE AREA = "AREAB";
/*<sc-view>Views.EMPLOYEEB</sc-view>*/
CREATE OR REPLACE VIEW MyDatabase.Views.EMPLOYEEB
AS
SELECT * FROM MyDatabase.Views.EMPLOYEE
WHERE AREA = "AREAB";
선택되지 않음¶
/*<sc-view>RMSviews.EMPLOYEEB</sc-view>*/
CREATE OR REPLACE VIEW RMSviews.PUBLIC.EMPLOYEEB
AS
SELECT * FROM RMSviews.PUBLIC.EMPLOYEE
WHERE AREA = "AREAB";
/*<sc-view>Views.EMPLOYEEB</sc-view>*/
CREATE OR REPLACE VIEW Views.PUBLIC.EMPLOYEEB
AS
SELECT * FROM Views.PUBLIC.EMPLOYEE
WHERE AREA = "AREAB";
Known Issues¶
1. Locking row for access logic difference¶
Snowflake에서 오브젝트 및 요소에 대한 액세스는 사용자 및 권한을 기반으로 합니다.
관련 EWIs¶
SSC-FDM-0007: 종속성이 누락된 요소입니다.
SSC-FDM-0019: 의미 체계 정보를 로드할 수 없습니다.
테이블¶
Teradata TABLE를 Snowflake로 변환하기 위한 변환 참조
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명 ¶
Teradata의 TABLE 문은 Snowflake TABLE 구문으로 변환됩니다.
Teradata TABLEs 에 대한 자세한 내용은 여기 에서 확인할 수 있습니다.
샘플 소스 패턴¶
간단한 테이블 생성¶
Teradata
테이블¶
CREATE TABLE table1, no fallback,
no before journal,
no after journal (
c1 INTEGER NOT NULL,
f1 INTEGER NOT NULL,
p1 INTEGER NOT NULL,
DATE,
TIME,
FOREIGN KEY(f1) REFERENCES WITH CHECK OPTION table2 (d1)
)
UNIQUE PRIMARY INDEX(c1)
PARTITION BY COLUMN(p1);
Snowflake
테이블¶
CREATE OR REPLACE TABLE table1 (
c1 INTEGER NOT NULL,
f1 INTEGER NOT NULL,
p1 INTEGER NOT NULL,
DATE,
TIME,
FOREIGN KEY(f1) REFERENCES table2 (d1) ,
UNIQUE (c1)
)
----** SSC-FDM-0038 - MICRO-PARTITIONING IS AUTOMATICALLY HANDLED ON ALL SNOWFLAKE TABLES **
--PARTITION BY COLUMN(p1)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "09/19/2025", "domain": "no-domain-provided" }}'
;
테이블 종류 절 - SET 및 MULTISET¶
Teradata의 kind 절은 중복 행이 허용되는지 여부(MULTISET) 또는 허용되지 않는지 여부(SET)를 결정합니다.
Teradata¶
테이블¶
-- Set semantics
CREATE SET TABLE table1 (
column1 INTEGER
);
--Multiset semantics
CREATE MULTISET TABLE table2(
column1 INTEGER
);
Snowflake¶
테이블¶
-- Set semantics
--** SSC-FDM-TD0024 - SET TABLE FUNCTIONALITY NOT SUPPORTED. TABLE MIGHT HAVE DUPLICATE ROWS **
CREATE OR REPLACE TABLE table1 (
column1 INTEGER
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
--Multiset semantics
CREATE OR REPLACE TABLE table2 (
column1 INTEGER
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
휘발성 및 글로벌 임시 테이블¶
teradata의 휘발성 및 글로벌 임시 테이블은 데이터의 임시 저장소에 사용됩니다. 글로벌 임시 테이블의 테이블 정의(DDL)는 Data Dictionary에 유지되는 반면, 휘발성 테이블 정의는 저장되지 않는다는 점에서 차이가 있습니다.
Teradata¶
테이블¶
--Global Temporary Table
CREATE MULTISET GLOBAL TEMPORARY TABLE table1 (
column1 INTEGER
);
--Volatile Table
CREATE MULTISET VOLATILE TABLE table3 (
column1 INTEGER
);
Snowflake¶
테이블¶
--Global Temporary Table
--** SSC-FDM-0009 - GLOBAL TEMPORARY TABLE FUNCTIONALITY NOT SUPPORTED. **
CREATE OR REPLACE TABLE table1 (
column1 INTEGER
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
--Volatile Table
CREATE OR REPLACE TEMPORARY TABLE table3 (
column1 INTEGER
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
데이터 포함 및 데이터 미포함 옵션¶
Teradata
테이블¶
-- With data
CREATE TABLE table1 AS table2 WITH DATA
-- With no data
CREATE TABLE table1 AS table2 WITH NO DATA
Snowflake
테이블¶
-- With data
CREATE OR REPLACE TABLE table1 CLONE table2
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
-- With no data
--** SSC-FDM-0019 - SEMANTIC INFORMATION COULD NOT BE LOADED FOR table1. CHECK IF THE NAME IS INVALID OR DUPLICATED. **
CREATE OR REPLACE TABLE table1 LIKE table2
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
Snowflake의 예약 & 제한된 키워드¶
SnowConvert AI는 예약 키워드와 관련된 문제를 해결하여 Snowflake로의 원활한 SQL 마이그레이션을 지원합니다. Snowflake의 예약 및 제한 키워드 설명서에 따라, 특정 키워드는 특별한 처리 없이 열 이름, 테이블 이름 또는 별칭으로 사용할 수 없습니다. SnowConvert AI에는 이러한 경우 SQL 코드 호환성을 보장하는 기능이 포함되어 있습니다.
ANSI 키워드는 열 이름으로 예약됨
ANSI 또는 Snowflake 예약 키워드와 일치하는 열 이름의 경우, SnowConvert AI는 Snowflake의 구문 규칙을 준수하기 위해 자동으로 열 이름을 큰따옴표(")로 묶습니다. 이러한 조정을 통해 해당 열 이름의 쿼리가 수동 개입 없이 Snowflake에서 올바르게 컴파일됩니다.
예:
테이블¶
CREATE TABLE ReservedKeywords (
"CREATE" VARCHAR(50),
FOLLOWING VARCHAR(50),
"ILIKE" VARCHAR(50),
RLIKE VARCHAR(50)
);
Snowflake
테이블¶
CREATE OR REPLACE TABLE ReservedKeywords (
"CREATE" VARCHAR(50),
"FOLLOWING" VARCHAR(50),
"ILIKE" VARCHAR(50),
"RLIKE" VARCHAR(50)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "11/28/2024", "domain": "test" }}'
;
Snowflake 전용 예약 키워드
Snowflake 전용 예약 키워드와 일치하는 열(예: CONSTRAINT, CURRENT_DATE, CURRENT_TIME)은 따옴표로 묶인 경우에도 여전히 컴파일 문제를 일으킬 수 있습니다. SnowConvert AI는 이러한 인스턴스를 감지하고 코드 SSC-EWI-0045와 함께 경고를 생성하여 사용자에게 호환성을 위해 이러한 열을 검토하고 잠재적으로 이름을 바꾸라는 메시지를 표시합니다.
예:
테이블¶
CREATE TABLE ColumnReservedNames (
"CONSTRAINT" VARCHAR(50),
"CURRENT_DATE" VARCHAR(50),
"CURRENT_TIME" VARCHAR(50)
);
Snowflake
테이블¶
CREATE OR REPLACE TABLE ColumnReservedNames (
!!!RESOLVE EWI!!! /*** SSC-EWI-0045 - COLUMN NAME 'CONSTRAINT' IS A SNOWFLAKE RESERVED KEYWORD ***/!!!
"CONSTRAINT" VARCHAR(50),
!!!RESOLVE EWI!!! /*** SSC-EWI-0045 - COLUMN NAME 'CURRENT_DATE' IS A SNOWFLAKE RESERVED KEYWORD ***/!!!
"CURRENT_DATE" VARCHAR(50),
!!!RESOLVE EWI!!! /*** SSC-EWI-0045 - COLUMN NAME 'CURRENT_TIME' IS A SNOWFLAKE RESERVED KEYWORD ***/!!!
"CURRENT_TIME" VARCHAR(50)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "11/28/2024", "domain": "test" }}'
;
Known Issues¶
1. Create table options not supported¶
“단순 Create Table” 예제에서 볼 수 있듯이 Snowflake는 Teradata 테이블 생성하기 옵션을 지원하지 않습니다. 제거됩니다.
2. Partition by performance issues¶
“단순 Create Table” 예제에서는 성능 고려 사항으로 인해 partition by 문이 제거되었습니다.
3. Primary Index moved¶
Teradata에서는 기본 인덱스 제약 조건이 create table 문 외부에 선언되지만, Snowflake에서는 “Simple Create Table” 예제에서와 같이 내부에 있어야 합니다.
4. SET semantics not supported¶
“테이블 종류 절 - SET 및 MULTISET” 예제에서 볼 수 있듯이, Snowflake는 Teradata의 SET 의미 체계를 지원하지 않습니다. 제거됩니다.
5. Global Temporary table option not supported¶
“휘발성 및 글로벌 임시 테이블” 예제에서 볼 수 있듯이, Snowflake는 Teradata의 글로벌 임시 테이블 옵션을 지원하지 않습니다. 제거됩니다.
6. Compress unsupported¶
COMPRESS (값1. 값2, 값3) 이 지원되지 않으므로 제거됩니다.
7. On commit unsupported¶
On commit 이 지원되지 않아 제거되었습니다.
8. Block compression unsupported¶
Block compression 이 지원되지 않아 제거되었습니다.
9. Normalize unsupported¶
Normalize 가 지원되지 않아 제거되었습니다.
관련 EWIs¶
SSC-FDM-0009: GLOBAL TEMPORARY TABLE 기능은 지원되지 않습니다.
SSC-FDM-0019: 의미 체계 정보를 로드할 수 없습니다.
SSC-FDM-TD0024: 테이블 설정 기능은 지원되지 않습니다.
SSC-PRF-0007: CLUSTER BY 성능을 검토합니다.
SSC-EWI-0045: 열 이름이 Snowflake 예약 키워드입니다.
WITH DEFAULT¶
열 정의의 Teradata WITH DEFAULT 절을 Snowflake로 변환하기 위한 변환 참조
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명 ¶
Teradata의 WITHDEFAULT 절은 값 없이 삽입되는 열에 시스템 기본값을 설정합니다. 이 값은 일반적으로 0 또는 비어 있는 것과 같습니다.
구문:¶
WITH DEFAULT
다음 테이블에는 Teradata의 데이터 타입, Snowflake에서 해당 유형 및 지원되는 경우 설정할 기본값이 나와 있습니다.
| Teradata | Snowflake | Default Value |
|---|---|---|
| BLOB[(n)] | BYTE | NOT SUPPORTED |
| BYTE[(n)] | BYTE | NOT SUPPORTED |
| VARBYTE[(n)] | BYTE | NOT SUPPORTED |
| BIGINT | BIGINT | 0 |
| BYTEINT | BYTEINT | 0 |
| DECIMAL [(n[,m])] | DECIMAL | 0 |
| DOUBLE PRECISION | DOUBLE PRECISION | 0 |
| FLOAT | FLOAT | 0 |
| INTEGER | INTEGER | 0 |
| NUMBER(n[,m]) | NUMBER | 0 |
| NUMBER[(*[,m])] | NUMBER | 0 |
| NUMERIC [(n[,m])] | NUMERIC | 0 |
| REAL | REAL | 0 |
| SMALLINT | SMALLINT | 0 |
| DATE | DATE | CURRENT_DATE |
| TIME [(n)] | TIME | CURRENT_TIME |
| TIMESTAMP [(n)] | TIMESTAMP | CURRENT_TIMESTAMP |
| TIMESTAMP WITH TIME ZONE | TIMESTAMP_TZ | LOCALTIMESTAMP |
| INTERVAL DAY [(n)] | VARCHAR(21) | '0DAY' |
| INTERVAL DAY [(n)] TO HOUR | VARCHAR(21) | '0DAY' |
| INTERVAL DAY [(n)] TO MINUTE | VARCHAR(21) | '0DAY' |
| INTERVAL DAY [(n)] TO SECOND | VARCHAR(21) | '0DAY' |
| INTERVAL HOUR [(n)] | VARCHAR(21) | '0HOUR' |
| INTERVAL HOUR [(n)] TO MINUTE | VARCHAR(21) | '0HOUR' |
| INTERVAL HOUR [(n)] TO SECOND | VARCHAR(21) | '0HOUR' |
| INTERVAL MINUTE [(n)] | VARCHAR(21) | '0MINUTE' |
| INTERVAL MINUTE [(n)] TO SECOND [(m)] | VARCHAR(21) | '0MINUTE' |
| INTERVAL MONTH | VARCHAR(21) | '0MONTH' |
| INTERVAL SECOND [(n,[m])] | VARCHAR(21) | '0SECOND' |
| INTERVAL YEAR [(n)] | VARCHAR(21) | '0YEAR' |
| INTERVAL YEAR [(n)] TO MONTH | VARCHAR(21) | '0YEAR' |
| CHAR[(n)] | CHAR | '' |
| CHARACTER(n) CHARACTER SET GRAPHIC | - | NOT SUPPORTED |
| CLOB | - | NOT SUPPORTED |
| CHAR VARYING(n) | VARCHAR | '' |
| LONG VARCHAR | - | NOT SUPPORTED |
| LONG VARCHAR CHARACTER SET GRAPHIC | - | NOT SUPPORTED |
| VARCHAR(n) | VARCHAR | '' |
| VARCHAR(n) CHARACTER SET GRAPHIC | - | NOT SUPPORTED |
| PERIOD(DATE) | VARCHAR(24) | NOT SUPPORTED |
| PERIOD(TIME [(n)]) | VARCHAR(24) | NOT SUPPORTED |
| PERIOD(TIMESTAMP [(n)]) | VARCHAR(24) | NOT SUPPORTED |
샘플 소스 패턴¶
Teradata¶
쿼리¶
CREATE TABLE SAMPLE_TABLE
(
ID INT,
-- Numeric Types
big_integer_col BIGINT WITH DEFAULT,
byteint_col BYTEINT WITH DEFAULT,
decimal_col DECIMAL(10,2) WITH DEFAULT,
double_precision_col DOUBLE PRECISION WITH DEFAULT,
float_col FLOAT WITH DEFAULT,
integer_col INTEGER WITH DEFAULT,
number_col NUMBER WITH DEFAULT,
numeric_col NUMERIC(10,2) WITH DEFAULT,
real_col REAL WITH DEFAULT,
smallint_col SMALLINT WITH DEFAULT,
-- Character Types
char_col CHAR(50) WITH DEFAULT,
character_col CHARACTER(50) WITH DEFAULT,
--clob_col CLOB,
char_varying_col CHAR VARYING(100) WITH DEFAULT,
--long_varchar_col LONG VARCHAR WITH DEFAULT,
--long_varchar_graphic_col LONG VARCHAR CHARACTER SET GRAPHIC WITH DEFAULT,
varchar_col VARCHAR(255) WITH DEFAULT,
--varchar_graphic_col VARCHAR(255) CHARACTER SET GRAPHIC WITH DEFAULT,
-- Date and Time Types
date_col DATE WITH DEFAULT,
time_col TIME WITH DEFAULT,
time_precision_col TIME(6) WITH DEFAULT,
timestamp_col TIMESTAMP WITH DEFAULT,
timestamp_precision_col TIMESTAMP(6) WITH DEFAULT,
tz_timestamp_col TIMESTAMP WITH TIME ZONE WITH DEFAULT,
tz_timestamp_precision_col TIMESTAMP(6) WITH TIME ZONE WITH DEFAULT,
interval_col INTERVAL DAY(4) WITH DEFAULT,
interval_day_to_hour_col INTERVAL DAY(4) TO HOUR WITH DEFAULT,
interval_hour_col INTERVAL HOUR(2) WITH DEFAULT,
interval_minute_col INTERVAL MINUTE(2) WITH DEFAULT,
interval_month_col INTERVAL MONTH WITH DEFAULT,
interval_second_col INTERVAL SECOND(2) WITH DEFAULT,
interval_year_col INTERVAL YEAR(4) WITH DEFAULT,
-- Binary Types
-- blob_col BLOB(1000),
byte_col BYTE(1000) WITH DEFAULT,
varbyte_col VARBYTE(1000) WITH DEFAULT
);
Snowflake ¶
쿼리¶
CREATE OR REPLACE TABLE SAMPLE_TABLE
(
ID INT,
-- Numeric Types
big_integer_col BIGINT DEFAULT 0,
byteint_col BYTEINT DEFAULT 0,
decimal_col DECIMAL(10,2) DEFAULT 0,
double_precision_col DOUBLE PRECISION DEFAULT 0,
float_col FLOAT DEFAULT 0,
integer_col INTEGER DEFAULT 0,
number_col NUMBER(38, 18) DEFAULT 0,
numeric_col NUMERIC(10,2) DEFAULT 0,
real_col REAL DEFAULT 0,
smallint_col SMALLINT DEFAULT 0,
-- Character Types
char_col CHAR(50) DEFAULT '',
character_col CHARACTER(50) DEFAULT '',
--clob_col CLOB,
char_varying_col CHAR VARYING(100) DEFAULT '',
--long_varchar_col LONG VARCHAR WITH DEFAULT,
--long_varchar_graphic_col LONG VARCHAR CHARACTER SET GRAPHIC WITH DEFAULT,
varchar_col VARCHAR(255) DEFAULT '',
--varchar_graphic_col VARCHAR(255) CHARACTER SET GRAPHIC WITH DEFAULT,
-- Date and Time Types
date_col DATE DEFAULT CURRENT_DATE,
time_col TIME DEFAULT CURRENT_TIME,
time_precision_col TIME(6) DEFAULT CURRENT_TIME(6),
timestamp_col TIMESTAMP
-- !!!RESOLVE EWI!!! /*** SSC-EWI-0013 - EXCEPTION THROWN WHILE CONVERTING ITEM: Mobilize.T12Data.Sql.Ast.TdWithDefaultAttribute. LINE: 31 OF FILE: /Users/hbadillabonilla/Documents/Workspace/migrations-snowconvert/Tools/DocVerifier/out/temp/CUebOYutwG1Dca8jb0Fo/8921d487/SOURCE/Teradata_01.sql ***/!!!
-- WITH DEFAULT
,
timestamp_precision_col TIMESTAMP(6)
-- !!!RESOLVE EWI!!! /*** SSC-EWI-0013 - EXCEPTION THROWN WHILE CONVERTING ITEM: Mobilize.T12Data.Sql.Ast.TdWithDefaultAttribute. LINE: 32 OF FILE: /Users/hbadillabonilla/Documents/Workspace/migrations-snowconvert/Tools/DocVerifier/out/temp/CUebOYutwG1Dca8jb0Fo/8921d487/SOURCE/Teradata_01.sql ***/!!!
-- WITH DEFAULT
,
tz_timestamp_col TIMESTAMP_TZ
-- WITH DEFAULT
-- !!!RESOLVE EWI!!! /*** SSC-EWI-0021 - WITH DEFAULT FOR 'TIMESTAMP WITH TIME ZONE' NOT SUPPORTED IN SNOWFLAKE ***/!!!
,
tz_timestamp_precision_col TIMESTAMP_TZ(6)
-- WITH DEFAULT
-- !!!RESOLVE EWI!!! /*** SSC-EWI-0021 - WITH DEFAULT FOR 'TIMESTAMP(6) WITH TIME ZONE' NOT SUPPORTED IN SNOWFLAKE ***/!!!
,
interval_col VARCHAR(21) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL DAY(4) DATA TYPE CONVERTED TO VARCHAR ***/!!! DEFAULT '0DAY',
interval_day_to_hour_col VARCHAR(21) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL DAY(4) TO HOUR DATA TYPE CONVERTED TO VARCHAR ***/!!! DEFAULT '0DAY',
interval_hour_col VARCHAR(21) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL HOUR(2) DATA TYPE CONVERTED TO VARCHAR ***/!!! DEFAULT '0HOUR',
interval_minute_col VARCHAR(21) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL MINUTE(2) DATA TYPE CONVERTED TO VARCHAR ***/!!! DEFAULT '0MINUTE',
interval_month_col VARCHAR(21) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL MONTH DATA TYPE CONVERTED TO VARCHAR ***/!!! DEFAULT '0MONTH',
interval_second_col VARCHAR(21) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL SECOND(2) DATA TYPE CONVERTED TO VARCHAR ***/!!! DEFAULT '0SECOND',
interval_year_col VARCHAR(21) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL YEAR(4) DATA TYPE CONVERTED TO VARCHAR ***/!!! DEFAULT '0YEAR',
-- Binary Types
-- blob_col BLOB(1000),
byte_col BINARY
-- WITH DEFAULT
-- !!!RESOLVE EWI!!! /*** SSC-EWI-0021 - WITH DEFAULT FOR 'BYTE(1000)' NOT SUPPORTED IN SNOWFLAKE ***/!!!
,
varbyte_col BINARY(1000)
-- WITH DEFAULT
-- !!!RESOLVE EWI!!! /*** SSC-EWI-0021 - WITH DEFAULT FOR 'VARBYTE(1000)' NOT SUPPORTED IN SNOWFLAKE ***/!!!
)
Known Issues¶
1. Unsupported types¶
설명 테이블의 테이블에 표시된 것처럼 일부 유형은 지원되지 않으며 WITHDEFAULT 절을 변환할 때 기본값이 설정되지 않습니다.
관련 EWIs¶
SSC-EWI-0021: Snowflake에서 지원되지 않습니다.
SSC-EWI-0036: 데이터 타입이 다른 데이터 타입으로 변환되었습니다.
CREATE MACRO¶
Teradata CREATE MACRO를 Snowflake Scripting으로 변환하기 위한 변환 참조
설명 ¶
Teradata CREATE MACRO 는 일반적으로 사용되거나 복잡한 작업을 수행하는 1개 이상의 문을 정의하여 동일한 문 시퀀스를 여러 번 작성하지 않도록 합니다. 매크로는 EXECUTE 문으로 호출하면 실행됩니다.
CREATE MACRO 에 대한 자세한 내용은 여기 를 클릭하십시오.
CREATE MACRO <macroname> [(parameter1, parameter2,...)] (
<sql_statements>
);
[ EXECUTE | EXEC ] <macroname>;
샘플 소스 패턴 ¶
설정 데이터¶
이 섹션에 있는 샘플 패턴을 실행하려면 다음 코드가 필요합니다.
Teradata¶
CREATE TABLE DEPOSIT
(
ACCOUNTNO NUMBER,
ACCOUNTNAME VARCHAR(100)
);
INSERT INTO DEPOSIT VALUES (1, 'Account 1');
INSERT INTO DEPOSIT VALUES (2, 'Account 2');
INSERT INTO DEPOSIT VALUES (3, 'Account 3');
INSERT INTO DEPOSIT VALUES (4, 'Account 4');
Snowflake¶
CREATE OR REPLACE TABLE DEPOSIT
(
ACCOUNTNO NUMBER(38, 18),
ACCOUNTNAME VARCHAR(100)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO DEPOSIT
VALUES (1, 'Account 1');
INSERT INTO DEPOSIT
VALUES (2, 'Account 2');
INSERT INTO DEPOSIT
VALUES (3, 'Account 3');
INSERT INTO DEPOSIT
VALUES (4, 'Account 4');
기본 매크로 ¶
Snowflake에는 매크로 오브젝트가 없으므로 변환 도구는 Teradata 매크로를 Snowflake Scripting 저장 프로시저로 변환합니다. 또한 반환된 결과 세트의 기능을 복제하기 위해 Snowflake Scripting에서는 매크로에서 데이터 세트를 반환해야 하는 쿼리가 RESULTSET 변수에 할당된 다음 반환됩니다.
Teradata ¶
쿼리¶
REPLACE MACRO DEPOSITID (ID INT)
AS
(
SELECT * FROM DEPOSIT WHERE ACCOUNTNO=:ID;
);
EXECUTE DEPOSITID(2);
결과¶
+--------------+--------------+
| ACCOUNTNO | ACCOUNTNAME |
|--------------+--------------|
| 2 | Account 2 |
+--------------+--------------+
Snowflake Scripting <a href=”#expected-code”id=”expected-code”> ¶
쿼리¶
CREATE OR REPLACE PROCEDURE DEPOSITID (ID FLOAT)
RETURNS TABLE ()
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
BEGIN
LET res RESULTSET := (SELECT * FROM DEPOSIT WHERE ACCOUNTNO=:ID);
RETURN TABLE(res);
END;
$$;
CALL DEPOSITID(2);
결과¶
+--------------+--------------+
| ACCOUNTNO | ACCOUNTNAME |
|--------------+--------------|
| 2 | Account 2 |
+--------------+--------------+
매크로가 다른 매크로를 호출하는 방법 ¶
SnowConvert AI는 매크로가 다른 매크로를 호출하고 전이성을 통해 Snowflake의 RESULT_SCAN(LAST_QUERY_ID())에서 결과를 가져와 결과 세트가 반환되는 시나리오를 지원합니다.
Teradata¶
쿼리¶
REPLACE MACRO MacroCallOtherMacro (ID INT)
AS
(
EXECUTE DEPOSITID(:ID);
);
EXECUTE MacroCallOtherMacro(2);
결과¶
+--------------+--------------+
| ACCOUNTNO | ACCOUNTNAME |
|--------------+--------------|
| 2 | Account 2 |
+--------------+--------------+
Snowflake Scripting ¶
쿼리¶
CREATE OR REPLACE PROCEDURE MacroCallOtherMacro (ID FLOAT)
RETURNS TABLE (
)
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "09/09/2024" }}'
EXECUTE AS CALLER
AS
$$
BEGIN
CALL DEPOSITID(:ID);
LET res RESULTSET :=
(
SELECT
*
FROM
TABLE(RESULT_SCAN(LAST_QUERY_ID()))
);
RETURN TABLE(res);
END;
$$;
CALL MacroCallOtherMacro(2);
결과¶
+--------------+--------------+
| ACCOUNTNO | ACCOUNTNAME |
|--------------+--------------|
| 2 | Account 2 |
+--------------+--------------+
결과 세트가 없는 매크로¶
모든 매크로가 결과 세트를 반환하도록 되어 있는 것은 아닙니다. 언급된 시나리오도 지원됩니다.
Teradata¶
쿼리¶
REPLACE MACRO MacroWithoutSelect (ACCOUNTNO NUMBER, ACCOUNTNAME VARCHAR(100))
AS
(
INSERT INTO DEPOSIT VALUES (:ACCOUNTNO, :ACCOUNTNAME);
);
EXECUTE MacroWithoutSelect(5, 'Account 5');
SELECT * FROM DEPOSIT;
결과¶
+--------------+--------------+
| ACCOUNTNO | ACCOUNTNAME |
|--------------+--------------|
| 1 | Account 1 |
+--------------+--------------+
| 2 | Account 2 |
+--------------+--------------+
| 3 | Account 3 |
+--------------+--------------+
| 4 | Account 4 |
+--------------+--------------+
| 5 | Account 5 |
+--------------+--------------+
Snowflake Scripting ¶
쿼리¶
CREATE OR REPLACE PROCEDURE MacroWithoutSelect (ACCOUNTNO FLOAT, ACCOUNTNAME VARCHAR(100))
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
BEGIN
INSERT INTO DEPOSIT
VALUES (:ACCOUNTNO, :ACCOUNTNAME);
END;
$$;
CALL MacroWithoutSelect(5, 'Account 5');
SELECT * FROM DEPOSIT;
결과¶
+--------------+--------------+
| ACCOUNTNO | ACCOUNTNAME |
|--------------+--------------|
| 1 | Account 1 |
+--------------+--------------+
| 2 | Account 2 |
+--------------+--------------+
| 3 | Account 3 |
+--------------+--------------+
| 4 | Account 4 |
+--------------+--------------+
| 5 | Account 5 |
+--------------+--------------+
매크로는 여러 결과 세트를 반환합니다¶
Teradata에서 매크로는 단일 매크로에서 2개 이상의 결과 세트를 반환할 수 있습니다.
Snowflake Scripting 프로시저에서는 프로시저당 1개의 결과 세트만 반환할 수 있습니다. Teradata 동작을 복제하기 위해 반환할 결과 세트가 2개 이상 있는 경우 임시 테이블에 저장됩니다. Snowflake Scripting 프로시저는 임시 테이블의 이름이 포함된 배열을 반환합니다.
Teradata¶
쿼리¶
REPLACE MACRO DEPOSITID (ID INT)
AS
(
SELECT * FROM DEPOSIT WHERE ACCOUNTNO=4;
SELECT * FROM DEPOSIT WHERE ACCOUNTNO=:ID;
EXECUTE DEPOSITID(:ID);
);
EXECUTE DEPOSITID(2);
결과 세트 1¶
+--------------+--------------+
| ACCOUNTNO | ACCOUNTNAME |
|--------------+--------------|
| 4 | Account 4 |
+--------------+--------------+
결과 세트 2¶
+--------------+--------------+
| ACCOUNTNO | ACCOUNTNAME |
|--------------+--------------|
| 2 | Account 2 |
+--------------+--------------+
Snowflake Scripting ¶
쿼리¶
CREATE OR REPLACE PROCEDURE DEPOSITID (ID FLOAT)
RETURNS ARRAY
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "09/09/2024" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
return_arr ARRAY := array_construct();
tbl_nm VARCHAR;
BEGIN
tbl_nm := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:tbl_nm) AS
SELECT
* FROM
DEPOSIT
WHERE ACCOUNTNO=4;
return_arr := array_append(return_arr, :tbl_nm);
tbl_nm := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:tbl_nm) AS
SELECT
* FROM
DEPOSIT
WHERE ACCOUNTNO=:ID;
return_arr := array_append(return_arr, :tbl_nm);
CALL DEPOSITID(:ID);
tbl_nm := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:tbl_nm) AS
SELECT
*
FROM
TABLE(RESULT_SCAN(LAST_QUERY_ID()));
return_arr := array_append(return_arr, :tbl_nm);
--** SSC-FDM-0020 - MULTIPLE RESULT SETS ARE RETURNED IN TEMPORARY TABLES **
RETURN return_arr;
END;
$$;
CALL DEPOSITID(2);
결과 세트 1¶
+-----------------------------------------------------+
| DEPOSIDID |
|-----------------------------------------------------|
| [ |
| "RESULTSET_93D50CBB_F22C_418A_A88C_4E1DE101B500", |
| "RESULTSET_6BDE39D7_0554_406E_B52F_D9E863A3F15C" |
| ] |
+-----------------------------------------------------+
결과 레트 시각화¶
Snowflake에서 위의 프로시저를 실행하면 임시 테이블 이름이 포함된 배열이 반환됩니다.
[ “RESULTSET_93D50CBB_F22C_418A_A88C_4E1DE101B500”, “RESULTSET_6BDE39D7_0554_406E_B52F_D9E863A3F15C”]
Teradata에서와 같이 결과 세트를 표시하려면 다음 쿼리를 실행해야 합니다.
쿼리¶
SELECT * FROM table('RESULTSET_93D50CBB_F22C_418A_A88C_4E1DE101B500');
SELECT * FROM table('RESULTSET_6BDE39D7_0554_406E_B52F_D9E863A3F15C');
결과 세트 1¶
+--------------+--------------+
| ACCOUNTNO | ACCOUNTNAME |
|--------------+--------------|
| 4 | Account 4 |
+--------------+--------------+
결과 세트 2¶
+--------------+--------------+
| ACCOUNTNO | ACCOUNTNAME |
|--------------+--------------|
| 2 | Account 2 |
+--------------+--------------+
알려진 문제 ¶
문제가 발견되지 않았습니다.
관련 EWIs¶
CREATE PROCEDURE¶
Teradata CREATE PROCEDURE를 Snowflake Scripting으로 변환하기 위한 변환 참조
설명
Teradata CREATE PROCEDURE 및 REPLACE PROCEDURE 문은 저장 프로시저 구현을 생성하거나 대체하고 컴파일합니다.
CREATE PROCEDURE 또는 REPLACEPROCEDURE 에 대한 자세한 내용을 보려면 여기를 클릭 하십시오.
-- Create/replace procedure syntax
{CREATE | REPLACE} PROCEDURE [database_name. | user_name.] procedure_name
([<parameter_definition>[, ...n]])
[<SQL_data_access>]
[DYNAMIC RESULT SETS number_of_sets]
[SQL SECURITY <privilege_option>]
statement;
<parameter_definition> := [IN | OUT | INOUT] parameter_name data_type
<SQL_data_access> := {CONTAINS SQL | MODIFIES SQL DATA | READS SQL DATA}
<privilege_option> := {CREATOR | DEFINER | INVOKER | OWNER}
샘플 소스 패턴 ¶
설정 데이터¶
이 섹션에 있는 샘플 패턴을 실행하려면 다음 코드가 필요합니다.
Teradata¶
CREATE TABLE inventory (
product_name VARCHAR(50),
price INTEGER
);
INSERT INTO inventory VALUES ('Bread', 50);
INSERT INTO inventory VALUES ('Tuna', 150);
INSERT INTO inventory VALUES ('Gum', 20);
INSERT INTO inventory VALUES ('Milk', 80);
Snowflake¶
CREATE OR REPLACE TABLE inventory (
product_name VARCHAR(50),
price INTEGER
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO inventory
VALUES ('Bread', 50);
INSERT INTO inventory
VALUES ('Tuna', 150);
INSERT INTO inventory
VALUES ('Gum', 20);
INSERT INTO inventory
VALUES ('Milk', 80);
기본 프로시저 <a href=”#example-code”id=”example-code”> ¶
Teradata ¶
쿼리¶
REPLACE PROCEDURE BasicProcedure(IN counterValue INTEGER)
BEGIN
DECLARE productName VARCHAR(50);
DECLARE productPrice INTEGER DEFAULT 0;
DECLARE whileCounter INTEGER DEFAULT 0;
SET productName = 'Salt';
WHILE (whileCounter < counterValue) DO
SET productPrice = 10 + productPrice;
SET whileCounter = whileCounter + 1;
END WHILE;
INSERT INTO inventory VALUES (productName, productPrice);
END;
CALL BasicProcedure(5);
SELECT product_name, price FROM inventory WHERE product_name = 'Salt';
결과¶
+--------------+--------------+
| product_name | price |
|--------------+--------------|
| Salt | 50 |
+--------------+--------------+
Snowflake Scripting <a href=”#expected-code”id=”expected-code”> ¶
쿼리¶
CREATE OR REPLACE PROCEDURE BasicProcedure (COUNTERVALUE INTEGER)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/10/2025", "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
productName VARCHAR(50);
productPrice INTEGER DEFAULT 0;
whileCounter INTEGER DEFAULT 0;
BEGIN
productName := 'Salt';
WHILE (:whileCounter < :counterValue) LOOP
productPrice := 10 + productPrice;
whileCounter := whileCounter + 1;
END LOOP;
INSERT INTO inventory
VALUES (:productName, :productPrice);
END;
$$;
CALL BasicProcedure(5);
SELECT
product_name,
price FROM
inventory
WHERE
UPPER(RTRIM( product_name)) = UPPER(RTRIM('Salt'));
결과¶
+--------------+--------------+
| product_name | price |
|--------------+--------------|
| Salt | 50 |
+--------------+--------------+
매개 변수 단일 선택 ¶
Teradata¶
쿼리¶
REPLACE PROCEDURE procedureLabelSingle(OUT Message VARCHAR(100))
BEGIN
set Message = 'Assignment value. Thanks';
END;
CALL procedureLabelSingle(?);
결과¶
Message |
------------------------+
Assignment value. Thanks|
Snowflake Scripting ¶
쿼리¶
CREATE OR REPLACE PROCEDURE procedureLabelSingle (MESSAGE OUT VARCHAR(100))
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/23/2024" }}'
EXECUTE AS CALLER
AS
$$
BEGIN
Message := 'Assignment value. Thanks';
END;
$$;
CALL procedureLabelSingle(?);
결과¶
+───────────────────────────────+
| PROCEDURELABELSINGLE |
+───────────────────────────────+
| ""Assignment value. Thanks"" |
+───────────────────────────────+
매개 변수 다중 선택 ¶
Teradata¶
쿼리¶
REPLACE PROCEDURE procedureLabelMultiple(OUT Message VARCHAR(100), OUT Message2 VARCHAR(100))
BEGIN
set Message = 'Assignment value. Thanks';
set Message2 = 'Assignment value2. Thanks';
END;
CALL procedureLabelSingle(?, ?);
결과¶
1 |2 |
------------------------+-------------------------+
Assignment value. Thanks|Assignment value2. Thanks|
Snowflake Scripting ¶
쿼리¶
CREATE OR REPLACE PROCEDURE procedureLabelMultiple (MESSAGE OUT VARCHAR(100), MESSAGE2 OUT VARCHAR(100))
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/16/2025", "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
BEGIN
Message := 'Assignment value. Thanks';
Message2 := 'Assignment value2. Thanks';
END;
$$;
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "procedureLabelSingle" **
CALL procedureLabelSingle(?, ?);
결과¶
+─────────────────────────+────────────────────────────────+
| PROCEDURELABELMULTIPLE | |
+─────────────────────────+────────────────────────────────+
| "{ | |
| ""Message"" | ""Assignment value. Thanks"", |
| ""Message2"" | ""Assignment value2. Thanks"" |
| }" | |
+─────────────────────────+────────────────────────────────+
동적 결과 세트가 있는 다매개 변수 다중 선택 ¶
Teradata¶
쿼리¶
REPLACE PROCEDURE Procedure1(out product_name VARCHAR(50), out price integer)
DYNAMIC RESULT SETS 2
BEGIN
DECLARE result_set CURSOR WITH RETURN ONLY FOR
SELECT * FROM inventory;
DECLARE result_set2 CURSOR WITH RETURN ONLY FOR
SELECT * FROM inventory;
SET price = 100;
SET product_name = 'another2';
OPEN result_set2;
OPEN result_set;
END;
REPLACE PROCEDURE Procedure2()
BEGIN
DECLARE price INTEGER;
DECLARE productName varchar(10);
CALL Procedure1(productName, price);
INSERT INTO inventory VALUES(:productName, :price);
END;
CALL Procedure2();
결과¶
 (1).png)
Snowflake Scripting ¶
쿼리¶
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "inventory" **
CREATE OR REPLACE PROCEDURE Procedure1 (PRODUCT_NAME OUT VARCHAR(50), PRICE OUT integer)
RETURNS ARRAY
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/16/2025", "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
tbl_result_set VARCHAR;
tbl_result_set2 VARCHAR;
return_arr ARRAY := array_construct();
BEGIN
tbl_result_set := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:tbl_result_set) AS
SELECT
* FROM
inventory;
LET result_set CURSOR
FOR
SELECT
*
FROM
IDENTIFIER(?);
tbl_result_set2 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:tbl_result_set2) AS
SELECT
* FROM
inventory;
LET result_set2 CURSOR
FOR
SELECT
*
FROM
IDENTIFIER(?);
price := 100;
product_name := 'another2';
OPEN result_set2 USING (tbl_result_set2);
return_arr := array_append(return_arr, :tbl_result_set2);
OPEN result_set USING (tbl_result_set);
return_arr := array_append(return_arr, :tbl_result_set);
--** SSC-FDM-0020 - MULTIPLE RESULT SETS ARE RETURNED IN TEMPORARY TABLES **
RETURN return_arr;
END;
$$;
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "inventory" **
CREATE OR REPLACE PROCEDURE Procedure2 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/16/2025", "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
price INTEGER;
productName varchar(10);
BEGIN
CALL Procedure1(:productName, :price);
INSERT INTO inventory
VALUES (:productName, :price);
END;
$$;
CALL Procedure2();
알려진 문제 ¶
1. SQL 데이터 액세스
기본적으로 Snowflake 프로시저는 데이터 읽기 또는 수정 문을 포함한 모든 종류의 SQL 문의 실행을 지원하므로 SQL 데이터 액세스 절은 관련이 없습니다. 프로시저를 변환할 때 이 절은 무시됩니다.
2. 평가 보고서의 최상위 오브젝트
저장 프로시저 내부의 요소(임시 테이블 또는 뷰)는 평가 보고서에서 최상위 오브젝트로 계산됩니다. SnowConvert AI 팀은 현재 이 시나리오에 대한 수정 사항을 마련하기 위해 노력하고 있습니다.
관련 EWIs¶
SSC-EWI-0073: 보류 중 함수 동등성 검토.
SSC-FDM-0020: 여러 결과 세트가 임시 테이블에 반환됩니다.