SnowConvert: Oracleリテラル翻訳リファレンス¶
テキストリテラル¶
説明¶
このリファレンスの他の部分で、式、条件、SQL 関数、SQL ステートメントの構文に文字列が登場するときは、テキストリテラル表記を使用して値を指定します。
[ {N | n} ]
{ '[ c ]...'
| { Q | q } 'quote_delimiter c [ c ]... quote_delimiter'
}
空の文字列 ('')¶
空の文字列は、Oracleでは NULL に相当します。Snowflakeでこの動作をエミュレートするために、リテラルがプロシージャ内で使用されているかどうかに応じて、空の文字列は NULL、またはundefinedに変換されます。
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;
推奨事項¶
Oracleの動作をシミュレートするために UDF を実装します。
移行時に列に格納されていたすでに変換済みの値を抽出し、可能であればSnowflake間隔定数として使用します。
さらにサポートが必要な場合は、snowconvert-support@snowflake.comまでメールでお問い合わせください。
間隔リテラル¶
説明¶
Snowflake間隔は算術演算でのみ使用できます。その他のシナリオで使用される間隔はサポートされていません。
コード例¶
入力コード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;