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('')|
\---------+
Snowflake
-- Query
SELECT UPPER(NULL) FROM DUAL;
-- Result
UPPER(NULL)|
\-----------+
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;
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|
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 |
Snowflake
-- Query
SELECT REPLACE('Hello world', '', 'l'), CONCAT('A','') FROM DUAL;
-- Result
REPLACE('HELLO WORLD', '', 'L')|CONCAT('A','')|
\-------------------------------+--------------+
Hello world |A |
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;
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;
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;
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;