SnowConvert: Oracleリテラル翻訳リファレンス

テキストリテラル

説明

このリファレンスの他の部分で、式、条件、SQL 関数、SQL ステートメントの構文に文字列が登場するときは、テキストリテラル表記を使用して値を指定します。

(Oracle 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('')|  
\---------+
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

推奨事項

  • Oracleの動作をシミュレートするために UDF を実装します。

  • 移行時に列に格納されていたすでに変換済みの値を抽出し、可能であればSnowflake間隔定数として使用します。

  • さらにサポートが必要な場合は、snowconvert-support@snowflake.comまでメールでお問い合わせください。

間隔リテラル

説明

Snowflake間隔は算術演算でのみ使用できます。その他のシナリオで使用される間隔はサポートされていません。

コード例

入力コード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