SnowConvert: Referenz zur Übersetzung von Oracle-Literalen

Textliterale

Beschreibung

Verwenden Sie die Notation für Textliterale, um Werte anzugeben, wenn Zeichenfolgen in der Syntax von Ausdrücken, Bedingungen, SQL Funktionen und SQL Anweisungen in anderen Teilen dieser Referenz erscheinen.

(Oracle SQL Language Reference Text literals)

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

Leere Zeichenfolge (‚‘)

Die leeren Zeichenfolgen entsprechen in Oracle der Adresse NULL. Um diese Verhaltensweise in Snowflake zu emulieren, werden leere Zeichenfolgen in NULL oder undefiniert umgewandelt, je nachdem, ob das Literal innerhalb einer Prozedur verwendet wird.

Oracle

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

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

Snowflake

-- Query  
SELECT UPPER(NULL) FROM DUAL;

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

Leere Zeichenfolge in gespeicherten Prozeduren

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

Leere Zeichenfolge in integrierten Funktionen

Die Transformation gilt nicht, wenn die leere Zeichenfolge als Argument der Funktionen REPLACE und CONCAT verwendet wird, um die Funktionsäquivalenz zu wahren.

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

Wenn die leeren Zeichenfolgen in diesen Fällen durch NULL ersetzt werden, sehen die Ergebnisse der Abfragen anders aus.

Intervalltyp und Datumstyp

Beschreibung

INTERVAL YEAR TO MONTH und INTERVAL DAY TO SECOND sind keine unterstützten Datentypen; sie werden in VARCHAR(20) umgewandelt. Daher werden alle arithmetischen Operationen zwischen Datumstypen und den ursprünglichen Intervalltyp-Spalten nicht unterstützt.

Außerdem werden Operationen zwischen einem Intervalltyp und einem Datumstyp (in dieser Reihenfolge) in Snowflake nicht unterstützt.

Beispielcode

Oracle-Eingabecode:

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

Ausgabecode:

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

Empfehlungen

  • Implementieren Sie die UDF, um die Oracle-Verhaltensweise zu simulieren.

  • Extrahieren Sie den bereits umgewandelten Wert, der während der Migration in der Spalte gespeichert wurde, und verwenden Sie ihn nach Möglichkeit als Snowflake Intervallkonstante.

  • Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden

Intervall-Literal

Beschreibung

Snowflake-Intervalle können nur bei arithmetischen Operationen verwendet werden. Intervalle, die in einem anderen Szenario verwendet werden, werden nicht unterstützt.

Beispielcode

Oracle-Eingabecode:

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

Ausgabecode:

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