SnowConvert: Oracle 리터럴 변환 참조

텍스트 리터럴

설명

이 참조의 다른 부분에서 표현식, 조건, SQL 함수 및 SQL 문의 구문에 문자열이 나타날 때마다 텍스트 리터럴 표기법을 사용하여 값을 지정합니다.

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

[ {N | n} ]
{ ‘[ c ]…’
| { Q | q } ‘quote_delimiter c [ c ]… quote_delimiter’
}

빈 문자열 (‘’)

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

Oracle

-- Query 
SELECT UPPER('') FROM DUAL;

-- Result
UPPER('')|  
\---------+
Copy

Snowflake

-- Query  
SELECT UPPER(NULL) FROM DUAL;

-- Result
UPPER(NULL)|  
\-----------+
Copy

저장 프로시저의 빈 문자열

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  |
Copy

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|
Copy

기본 제공 함수의 빈 문자열

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

Oracle

-- Query  
SELECT REPLACE('Hello world', '', 'l'), CONCAT('A','') FROM DUAL;

-- Result
REPLACE('HELLOWORLD','','L')|CONCAT('A','')|  
\----------------------------+--------------+  
Hello world                 |A             |
Copy

Snowflake

-- Query 
SELECT REPLACE('Hello world', '', 'l'), CONCAT('A','') FROM DUAL;

-- Result
REPLACE('HELLO WORLD', '', 'L')|CONCAT('A','')|  
\-------------------------------+--------------+  
Hello world                    |A             |
Copy

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

간격 유형 및 날짜 유형

설명

INTERVAL YEAR TO MONTH 및 INTERVAL DAY TO SECOND 는 지원되는 데이터 타입이 아니며, VARCHAR(20)로 변환됩니다. 따라서 날짜 유형 및 원본 간격 유형 열 간의 모든 산술 작업은 지원되지 않습니다.

또한 간격 유형과 날짜 유형(이 순서대로) 간의 연산은 Snowflake에서 지원되지 않습니다.

코드 예시

입력 코드 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

출력 코드:

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)  /\*\*\* SSC-EWI-0036 \- INTERVAL YEAR TO MONTH DATA TYPE CONVERTED TO VARCHAR \*\*\*/ ,  
        intervalDayToSecond\_col VARCHAR(20)  /\*\*\* 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  
    date\_col \+ intervalYearToMonth\_col  /\*\*\* SSC-EWI-OR0095 \- OPERATION BETWEEN INTERVAL TYPE AND DATE TYPE NOT SUPPORTED \*\*\*/  FROM  
    table\_with\_intervals;

    \-- Date \- Interval D to S  
SELECT  
    date\_col \- intervalDayToSecond\_col  /\*\*\* SSC-EWI-OR0095 \- OPERATION BETWEEN INTERVAL TYPE AND DATE TYPE NOT SUPPORTED \*\*\*/  FROM  
    table\_with\_intervals;

    \-- Timestamp \+ Interval D to S  
SELECT  
    time\_col \+ intervalDayToSecond\_col  /\*\*\* SSC-EWI-OR0095 \- OPERATION BETWEEN INTERVAL TYPE AND DATE TYPE NOT SUPPORTED \*\*\*/  FROM  
    table\_with\_intervals;

    \-- Timestamp \- Interval Y to M  
SELECT  
    time\_col \- intervalYearToMonth\_col  /\*\*\* SSC-EWI-OR0095 \- OPERATION BETWEEN INTERVAL TYPE AND DATE TYPE NOT SUPPORTED \*\*\*/  FROM  
    table\_with\_intervals;
Copy

권장 사항

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

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

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

간격 리터럴

설명

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

코드 예시

입력 코드 Oracle:

SELECT INTERVAL '1-5' YEAR TO MONTH FROM DUAL;
Copy

출력 코드:

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