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('')|
\---------+
Snowflake
-- Query
SELECT UPPER(NULL) FROM DUAL;
-- Result
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¶
-- Query
SELECT REPLACE('Hello world', '', 'l'), CONCAT('A','') FROM DUAL;
-- Result
REPLACE('HELLOWORLD','','L')|CONCAT('A','')|
\----------------------------+--------------+
Hello world |A |
Snowflake
-- Query
SELECT REPLACE('Hello world', '', 'l'), CONCAT('A','') FROM DUAL;
-- Result
REPLACE('HELLO WORLD', '', 'L')|CONCAT('A','')|
\-------------------------------+--------------+
Hello world |A |
이러한 경우 빈 문자열을 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;
출력 코드:¶
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;
권장 사항¶
UDF 를 구현하여 Oracle 동작을 시뮬레이션합니다.
마이그레이션 중에 열에 저장된 이미 변환된 값을 추출하고, 가능한 경우 Snowflake Interval Constant로 사용합니다.
추가 지원이 필요한 경우 snowconvert-support@Snowflake.com으로 이메일을 보내주십시오.
간격 리터럴¶
설명¶
Snowflake Intervals는 산술 작업에만 사용할 수 있습니다. 다른 시나리오에서 사용되는 간격은 지원되지 않습니다.
코드 예시¶
입력 코드 Oracle:¶
SELECT INTERVAL '1-5' YEAR TO MONTH FROM DUAL;
출력 코드:¶
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-0107 - INTERVAL LITERAL IS NOT SUPPORTED BY SNOWFLAKE IN THIS SCENARIO ***/!!!
INTERVAL '1-5' YEAR TO MONTH FROM DUAL;