SnowConvert : Référence de traduction des littéraux Oracle

Littéraux de texte

Description

Utilisez la notation littérale pour spécifier des valeurs chaque fois qu’une chaîne apparaît dans la syntaxe des expressions, des conditions, des fonctions SQL et des instructions SQL dans d’autres parties de cette référence.

(Référence linguistique Oracle SQL Littéraux de texte)

[ {N | n} ]
{ “[ c ]…”
| { Q | q } “quote_delimiter c [ c ]… quote_delimiter”
}

Chaîne vide (“”)

Les chaînes vides sont équivalentes à NULL dans Oracle. Pour émuler ce comportement dans Snowflake, les chaînes vides sont converties en NULL ou en undefined, selon que le littéral est utilisé à l’intérieur d’une procédure ou non.

Oracle

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

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

Snowflake

-- Query  
SELECT UPPER(NULL) FROM DUAL;

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

Chaîne vide dans les procédures stockées

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

Chaîne vide dans les fonctions intégrées

La transformation ne s’applique pas lorsque la chaîne vide est utilisée comme argument des fonctions REPLACE et CONCAT afin de conserver l’équivalence fonctionnelle.

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

Si les chaînes vides sont remplacées par NULL pour ces casses, les résultats des requêtes seront différents.

Type d’intervalle et type de date

Description

INTERVAL YEAR TO MONTH et INTERVAL DAY TO SECOND ne sont pas des types de données pris en charge ; ils sont transformés en VARCHAR(20). Par conséquent, toutes les opérations arithmétiques entre Date Types et les colonnes originales Interval Type Columns ne sont pas prises en charge.

De plus, les opérations entre un type d’intervalle et un type de date (dans cet ordre) ne sont pas prises en charge dans Snowflake.

Exemple de code

Code d’entrée 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

Code de sortie :

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

Recommandations

  • Mettez en œuvre l’UDF pour simuler le comportement d’Oracle.

  • Extrayez la valeur déjà transformée qui a été stockée dans la colonne pendant la migration, et utilisez-la comme Constante d’intervalle Snowflake lorsque c’est possible.

  • Si vous avez encore besoin d’aide, vous pouvez nous envoyer un e-mail à l’adresse suivante : snowconvert-support@snowflake.com

Littéral d’intervalle

Description

Les intervalles de Snowflake ne peuvent être utilisés que dans les opérations arithmétiques. Les intervalles utilisés dans tout autre scénario ne sont pas pris en charge.

Exemple de code

Code d’entrée Oracle :

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

Code de sortie :

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