SnowConvert AI - Oracle - 리터럴

리터럴과 상수 값이라는 용어는 동의어이며 고정 데이터 값을 나타냅니다.\ (Oracle SQL 언어 참조 리터럴)

간격 리터럴

현재 시나리오에서는 간격 리터럴이 지원되지 않음

설명

Snowflake Intervals는 산술 작업에만 사용할 수 있습니다. 다른 시나리오에서 사용되는 간격은 지원되지 않습니다.

코드 예시

Oracle
SELECT INTERVAL '1-5' YEAR TO MONTH FROM DUAL;
Copy
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;
Copy

Known Issues

문제가 발견되지 않았습니다.

간격 유형 및 날짜 유형

간격 유형과 날짜 유형 간의 연산이 지원되지 않음

설명

INTERVAL YEAR TO MONTHINTERVAL 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;
Copy
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;
Copy

권장 사항

  • UDF 를 구현하여 Oracle 동작을 시뮬레이션합니다.

  • 마이그레이션 중에 열에 저장된 이미 변환된 값을 추출하고, 가능한 경우 Snowflake Interval Constant로 사용합니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

관련 EWIS

  1. SSC-EWI-0036: 데이터 타입이 다른 데이터 타입으로 변환되었습니다.

  2. SSC-EWI-OR0095: 간격 유형과 날짜 유형 간의 연산은 지원되지 않습니다.

  3. SSC-FDM-OR0042: 타임스탬프로 변환된 날짜 유형의 동작이 다릅니다.

텍스트 리터럴

설명

이 참조의 다른 부분에 있는 식, 조건, SQL 함수 및 SQL 문의 구문에 string이 표시될 때마다 텍스트 리터럴 표기법을 사용하여 값을 지정합니다.

(Oracle SQL Language Reference 텍스트 리터럴)

[ {N | n} ]
{ '[ c ]...'
| { Q | q } 'quote_delimiter c [ c ]... quote_delimiter'
}
Copy

샘플 소스 패턴

빈 문자열 (‘’)

빈 문자열은 Oracle의 _NULL_과 동일하므로 Snowflake에서 동작을 에뮬레이션하기 위해 빈 문자열은 리터럴이 프로시저 내에서 사용되는지 여부에 따라 NULL 또는 _정의되지 않음_으로 변환됩니다.

Oracle
SELECT UPPER('') FROM DUAL;
Copy
결과

UPPER(‘’)

Snowflake
SELECT UPPER(NULL) FROM DUAL;
Copy
결과

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;
Copy
결과

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;
Copy
결과

COL1

COL2

hello

기본 제공 함수의 빈 문자열

경고

기능적 동등성을 유지하기 위해 빈 문자열이 REPLACECONCAT 함수의 인자로 사용되는 경우에는 변환이 적용되지 않습니다.

Oracle
SELECT REPLACE('Hello world', '', 'l'), CONCAT('A','') FROM DUAL;
Copy
결과

REPLACE(‘HELLOWORLD’,’’,’L’)

CONCAT(‘A’,’’)

Hello world

A

Snowflake
SELECT REPLACE('Hello world', '', 'l'), CONCAT('A','') FROM DUAL;
Copy
결과

REPLACE(‘HELLO WORLD’, ‘’, ‘L’)

CONCAT(‘A’,’’)

Hello world

A

참고

이러한 경우 빈 문자열을 NULL 로 대체하면 쿼리 결과가 달라집니다.

Known Issues

문제가 발견되지 않았습니다.

관련 EWIs

관련 EWIs 없음.