SnowConvert: Referência de conversão de literais do Oracle¶
Literais de texto¶
Descrição¶
Use a notação de literal de texto para especificar valores sempre que a cadeia de cadeia de caracteres aparecer na sintaxe de expressões, condições, funções SQL e instruções SQL em outras partes desta referência.
(Literais de texto da referência de linguagem Oracle SQL)
[ {N | n} ]
{ “[ c ]…”
| { Q | q } “quote_delimiter c [ c ]… quote_delimiter”
}
Cadeia de caracteres vazia (“”)¶
As cadeias de caracteres vazias são equivalentes a NULL no Oracle. Para emular esse comportamento no Snowflake, as cadeias de caracteres vazias são convertidas para NULL ou indefinidas, dependendo do fato de o literal ser usado dentro de um procedimento.
Oracle¶
-- Query
SELECT UPPER('') FROM DUAL;
-- Result
UPPER('')|
\---------+
Snowflake
-- Query
SELECT UPPER(NULL) FROM DUAL;
-- Result
UPPER(NULL)|
\-----------+
Cadeia de caracteres vazia em procedimentos armazenados¶
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|
Cadeia de caracteres vazia em funções internas¶
A transformação não se aplica quando a cadeia de caracteres vazia é usada como argumento das funções REPLACE e CONCAT para manter a equivalência funcional.
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 |
Se as cadeias de caracteres vazias forem substituídas por NULL para esses casos, os resultados das consultas serão diferentes.
Tipo de intervalo e tipo de data¶
Descrição¶
INTERVAL YEAR TO MONTH e INTERVAL DAY TO SECOND não são tipos de dados compatíveis; eles são transformados em VARCHAR(20). Portanto, não há suporte para todas as operações aritméticas entre Tipos de data e as Colunas de tipo de intervalo originais não são suportadas.
Além disso, as operações entre um tipo de intervalo e um tipo de data (nessa ordem) não são compatíveis com o Snowflake.
Exemplo de código¶
Código de entrada 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;
Código de saída:¶
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;
Recomendações¶
Implemente a UDF para simular o comportamento do Oracle.
Extraia o valor já transformado que foi armazenado na coluna durante a migração e use-o como uma constante de intervalo do Snowflake quando possível.
Se precisar de mais suporte, pode nos enviar um e-mail para snowconvert-support@snowflake.com
Literal de intervalo¶
Descrição¶
Os intervalos do Snowflake só podem ser usados em operações aritméticas. Os intervalos usados em qualquer outro cenário não são compatíveis.
Exemplo de código¶
Código de entrada Oracle:¶
SELECT INTERVAL '1-5' YEAR TO MONTH FROM DUAL;
Código de saída:¶
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-0107 - INTERVAL LITERAL IS NOT SUPPORTED BY SNOWFLAKE IN THIS SCENARIO ***/!!!
INTERVAL '1-5' YEAR TO MONTH FROM DUAL;