SnowConvert AI - Oracle - 리터럴¶
리터럴과 상수 값이라는 용어는 동의어이며 고정 데이터 값을 나타냅니다.\ (Oracle SQL 언어 참조 리터럴)
간격 리터럴¶
현재 시나리오에서는 간격 리터럴이 지원되지 않음
설명¶
Snowflake Intervals는 산술 작업에만 사용할 수 있습니다. 다른 시나리오에서 사용되는 간격은 지원되지 않습니다.
코드 예시¶
Oracle¶
SELECT INTERVAL '1-5' YEAR TO MONTH FROM DUAL;
Snowflake¶
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-0107 - INTERVAL LITERAL IS NOT SUPPORTED BY SNOWFLAKE IN THIS SCENARIO ***/!!!
INTERVAL '1-5' YEAR TO MONTH FROM DUAL;
Known Issues¶
문제가 발견되지 않았습니다.
간격 유형 및 날짜 유형¶
간격 유형과 날짜 유형 간의 연산이 지원되지 않음
설명¶
INTERVAL YEAR TO MONTH 및 INTERVAL DAY TO SECOND는 지원되는 데이터 타입이 아니므로 VARCHAR(20)로 변환됩니다. 따라서 날짜 유형 과 원본 간격 유형 열 간의 모든 산술 연산은 지원되지 않습니다.
또한, 간격 유형과 날짜 유형 간의 연산(이 순서대로)은 Snowflake에서 지원되지 않으며, 이러한 작업에서도 이 EWI를 사용합니다.
코드 예시¶
Oracle¶
CREATE TABLE table_with_intervals
(
date_col DATE,
time_col TIMESTAMP,
intervalYearToMonth_col INTERVAL YEAR TO MONTH,
intervalDayToSecond_col INTERVAL DAY TO SECOND
);
-- Date + Interval Y to M
SELECT date_col + intervalYearToMonth_col FROM table_with_intervals;
-- Date - Interval D to S
SELECT date_col - intervalDayToSecond_col FROM table_with_intervals;
-- Timestamp + Interval D to S
SELECT time_col + intervalDayToSecond_col FROM table_with_intervals;
-- Timestamp - Interval Y to M
SELECT time_col - intervalYearToMonth_col FROM table_with_intervals;
Snowflake¶
CREATE OR REPLACE TABLE table_with_intervals
(
date_col TIMESTAMP /*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/,
time_col TIMESTAMP(6),
intervalYearToMonth_col VARCHAR(20) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL YEAR TO MONTH DATA TYPE CONVERTED TO VARCHAR ***/!!!,
intervalDayToSecond_col VARCHAR(20) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL DAY TO SECOND DATA TYPE CONVERTED TO VARCHAR ***/!!!
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
;
-- Date + Interval Y to M
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0095 - OPERATION BETWEEN INTERVAL TYPE AND DATE TYPE NOT SUPPORTED ***/!!! date_col + intervalYearToMonth_col FROM
table_with_intervals;
-- Date - Interval D to S
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0095 - OPERATION BETWEEN INTERVAL TYPE AND DATE TYPE NOT SUPPORTED ***/!!! date_col - intervalDayToSecond_col FROM
table_with_intervals;
-- Timestamp + Interval D to S
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0095 - OPERATION BETWEEN INTERVAL TYPE AND DATE TYPE NOT SUPPORTED ***/!!! time_col + intervalDayToSecond_col FROM
table_with_intervals;
-- Timestamp - Interval Y to M
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0095 - OPERATION BETWEEN INTERVAL TYPE AND DATE TYPE NOT SUPPORTED ***/!!! time_col - intervalYearToMonth_col FROM
table_with_intervals;
권장 사항¶
UDF 를 구현하여 Oracle 동작을 시뮬레이션합니다.
마이그레이션 중에 열에 저장된 이미 변환된 값을 추출하고, 가능한 경우 Snowflake Interval Constant로 사용합니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
관련 EWIS¶
SSC-EWI-0036: 데이터 타입이 다른 데이터 타입으로 변환되었습니다.
SSC-EWI-OR0095: 간격 유형과 날짜 유형 간의 연산은 지원되지 않습니다.
SSC-FDM-OR0042: 타임스탬프로 변환된 날짜 유형의 동작이 다릅니다.
텍스트 리터럴¶
설명¶
이 참조의 다른 부분에 있는 식, 조건, SQL 함수 및 SQL 문의 구문에
string이 표시될 때마다 텍스트 리터럴 표기법을 사용하여 값을 지정합니다.
[ {N | n} ]
{ '[ c ]...'
| { Q | q } 'quote_delimiter c [ c ]... quote_delimiter'
}
샘플 소스 패턴¶
빈 문자열 (‘’)¶
빈 문자열은 Oracle의 _NULL_과 동일하므로 Snowflake에서 동작을 에뮬레이션하기 위해 빈 문자열은 리터럴이 프로시저 내에서 사용되는지 여부에 따라 NULL 또는 _정의되지 않음_으로 변환됩니다.
Oracle¶
SELECT UPPER('') FROM DUAL;
결과¶
UPPER(‘’) |
|---|
Snowflake¶
SELECT UPPER(NULL) FROM DUAL;
결과¶
UPPER(NULL) |
|---|
저장 프로시저의 빈 문자열¶
Oracle¶
CREATE TABLE empty_string_table(
col1 VARCHAR(10),
col2 VARCHAR(10));
CREATE OR REPLACE PROCEDURE null_proc AS
var1 INTEGER := '';
var3 INTEGER := null;
var2 VARCHAR(20) := 'hello';
BEGIN
var1 := var1 + 456;
var2 := var2 || var1;
IF var1 IS NULL THEN
INSERT INTO empty_string_table VALUES (var1, var2);
END IF;
END;
CALL null_proc();
SELECT * FROM empty_string_table;
결과¶
COL1 |
COL2 |
|---|---|
hello |
Snowflake¶
CREATE OR REPLACE TABLE empty_string_table (
col1 VARCHAR(10),
col2 VARCHAR(10))
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}}'
;
CREATE OR REPLACE PROCEDURE null_proc ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}}'
EXECUTE AS CALLER
AS
$$
DECLARE
var1 INTEGER := NULL;
var3 INTEGER := null;
var2 VARCHAR(20) := 'hello';
BEGIN
var1 := :var1 + 456;
var2 := NVL(:var2 :: STRING, '') || NVL(:var1 :: STRING, '');
IF (:var1 IS NULL) THEN
INSERT INTO empty_string_table
VALUES (:var1, :var2);
END IF;
END;
$$;
CALL null_proc();
SELECT * FROM
empty_string_table;
결과¶
COL1 |
COL2 |
|---|---|
hello |
기본 제공 함수의 빈 문자열¶
경고
기능적 동등성을 유지하기 위해 빈 문자열이 REPLACE 및 CONCAT 함수의 인자로 사용되는 경우에는 변환이 적용되지 않습니다.
Oracle¶
SELECT REPLACE('Hello world', '', 'l'), CONCAT('A','') FROM DUAL;
결과¶
REPLACE(‘HELLOWORLD’,’’,’L’) |
CONCAT(‘A’,’’) |
|---|---|
Hello world |
A |
Snowflake¶
SELECT REPLACE('Hello world', '', 'l'), CONCAT('A','') FROM DUAL;
결과¶
REPLACE(‘HELLO WORLD’, ‘’, ‘L’) |
CONCAT(‘A’,’’) |
|---|---|
Hello world |
A |
참고
이러한 경우 빈 문자열을 NULL 로 대체하면 쿼리 결과가 달라집니다.
Known Issues¶
문제가 발견되지 않았습니다.
관련 EWIs¶
관련 EWIs 없음.