SnowConvert AI - Oracle - Literais

Os termos literal e valor constante são sinônimos e referem-se a um valor de dados fixo.\ (Literais de referência de linguagem Oracle SQL)

Literal de intervalo

Literal de intervalo incompatível com o cenário atual

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

Oracle
SELECT INTERVAL '1-5' YEAR TO MONTH FROM DUAL;
Copy
Snowflake
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

Problemas conhecidos

Não foram encontrados problemas.

Tipo de intervalo e tipo de data

Operação entre o tipo de intervalo e o tipo de data não suportada

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, todas as operações aritméticas entre tipos de data e as colunas de tipo de intervalo originais são incompatíveis.

Além disso, operações entre um tipo de intervalo e um tipo de data (nesta ordem) não são compatíveis com o Snowflake, e essas operações também usam este EWI.

Exemplo de código

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
Snowflake
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) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL YEAR TO MONTH DATA TYPE CONVERTED TO VARCHAR ***/!!!,
        intervalDayToSecond_col VARCHAR(20) !!!RESOLVE EWI!!! /*** 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
    !!!RESOLVE EWI!!! /*** SSC-EWI-OR0095 - OPERATION BETWEEN INTERVAL TYPE AND DATE TYPE NOT SUPPORTED ***/!!! date_col + intervalYearToMonth_col FROM
    table_with_intervals;

    -- Date - Interval D to S
SELECT
    !!!RESOLVE EWI!!! /*** SSC-EWI-OR0095 - OPERATION BETWEEN INTERVAL TYPE AND DATE TYPE NOT SUPPORTED ***/!!! date_col - intervalDayToSecond_col FROM
    table_with_intervals;

    -- Timestamp + Interval D to S
SELECT
    !!!RESOLVE EWI!!! /*** SSC-EWI-OR0095 - OPERATION BETWEEN INTERVAL TYPE AND DATE TYPE NOT SUPPORTED ***/!!! time_col + intervalDayToSecond_col FROM
    table_with_intervals;

    -- Timestamp - Interval Y to M
SELECT
    !!!RESOLVE EWI!!! /*** SSC-EWI-OR0095 - OPERATION BETWEEN INTERVAL TYPE AND DATE TYPE NOT SUPPORTED ***/!!! time_col - intervalYearToMonth_col FROM
    table_with_intervals;
Copy

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, envie um e-mail para snowconvert-support@snowflake.com

EWIS relacionados

  1. SSC-EWI-0036: Tipo de dados convertido em outro tipo de dados.

  2. SSC-EWI-OR0095: Operação entre o tipo de intervalo e o tipo de data não suportada.

  3. SSC-FDM-OR0042: O tipo de data transformado em carimbo de data/hora tem um comportamento diferente.

Literais de texto

Descrição

Use a notação de literal de texto para especificar valores sempre que string aparece 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'
}
Copy

Amostra de padrões da origem

Cadeia de caracteres vazia (“”)

As cadeias de caracteres vazias são equivalentes a NULL no Oracle, portanto, para emular o comportamento no Snowflake, as cadeias de caracteres vazias são convertidas em NULL ou indefinido dependendo se o literal é usado dentro de um procedimento ou não.

Oracle
SELECT UPPER('') FROM DUAL;
Copy
Resultado

UPPER(“”)

Snowflake
SELECT UPPER(NULL) FROM DUAL;
Copy
Resultado

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;
Copy
Resultado

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;
Copy
Resultado

COL1

COL2

hello

Cadeia de caracteres vazia em funções internas

Aviso

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
SELECT REPLACE('Hello world', '', 'l'), CONCAT('A','') FROM DUAL;
Copy
Resultado

REPLACE(“HELLOWORLD”,””,”L”)

CONCAT(“A”,””)

Hello world

A

Snowflake
SELECT REPLACE('Hello world', '', 'l'), CONCAT('A','') FROM DUAL;
Copy
Resultado

REPLACE(“HELLO WORLD”, “”, “L”)

CONCAT(“A”,””)

Hello world

A

Nota

Se as cadeias de caracteres vazias forem substituídas por NULL para esses casos, os resultados das consultas serão diferentes.

Problemas conhecidos

Não foram encontrados problemas.

EWIs relacionados

Sem EWIs relacionados.