SnowConvert AI - Oracle - Tipos de dados internos do Oracle

Tipos de dados estendidos

Descrição

A partir do Oracle Database 12_c\_, você pode especificar um tamanho máximo de 32767 bytes para os tipos de dados VARCHAR2, NVARCHAR2 e RAW. Você pode controlar se o banco de dados suporta esse novo tamanho máximo definindo o parâmetro de inicialização MAX_STRING_SIZE.

Um tipo de dados VARCHAR2 ou NVARCHAR2 com tamanho declarado superior a 4000 bytes, ou um tipo de dados RAW com tamanho declarado superior a 2000 bytes, é um tipo de dados estendido. (Tipo de dados estendido da referência de linguagem Oracle SQL).

O Oracle permite aumentar o tamanho máximo da cadeia de caracteres do banco de dados de STANDARD para EXTENDED, no entanto, o Snowflake não contém um equivalente para essa funcionalidade.

Portanto, os tipos de dados estendidos VARCHAR2, NVARCHAR2 e RAW não são compatíveis com o Snowflake e são transformados apenas como tipos de dados VARCHAR2, NVARCHAR2 e RAW regulares. Consulte Tipos de dados de caractere e Tipos de dados RAW para obter mais informações.

Problemas conhecidos

1. MAX STRING SIZE not recognized

ALTER SYSTEM SET MAX_STRING_SIZE='EXTENDED';

Não está sendo analisado pelo SnowConvert.

Tipo de dados JSON

Descrição

O Oracle Database suporta o JSON nativamente com recursos de banco de dados relacional, incluindo transações, indexação, consultas declarativas e visualizações. Ao contrário dos dados relacionais, os dados JSON podem ser armazenados no banco de dados, indexados e consultados sem a necessidade de um esquema que defina os dados. (Tipo de dados JSON da referência de linguagem Oracle SQL).

Os tipos de dados JSON são transformados em VARIANT para emular o comportamento do Oracle.

JSON
Copy

Amostra de padrões da origem

Tipo de dados JSON como uma coluna em Create Table

Oracle
CREATE TABLE jsontable (
	json_column JSON
);

INSERT INTO jsontable VALUES('{"id": 1, "content":"json content"}');
INSERT INTO jsontable VALUES('{"stringdata": "this is a text","number": 1,"numberNeg": -1,"booleanT": true,"booleanGF": false,"nullvalue": null,"object": {"1": 1,"2": 2},"array": [1, 2, 3]}');
INSERT INTO jsontable VALUES(JSON('{"id": 4}'));
 
SELECT  * FROM jsontable;
Copy
Resultado

COL1

{«id»:1,»content»:»json content»}

{«stringdata»:»this is a text»,»number»:1,»numberNeg»:-1,»booleanT»:true,»booleanGF»:false,»nullvalue»:null,»object»:{«1»:1,»2»:2},»array»:[1,2,3]}

{«id»:4}

Snowflake
CREATE OR REPLACE TABLE jsontable (
	json_column VARIANT
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;

INSERT INTO jsontable
VALUES('{"id": 1, "content":"json content"}');

INSERT INTO jsontable
VALUES('{"stringdata": "this is a text","number": 1,"numberNeg": -1,"booleanT": true,"booleanGF": false,"nullvalue": null,"object": {"1": 1,"2": 2},"array": [1, 2, 3]}');

INSERT INTO jsontable
VALUES(JSON('{"id": 4}') !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'JSON' NODE ***/!!!);

SELECT  * FROM
	jsontable;
Copy

Aviso

As inserções de dados JSON não estão sendo tratadas corretamente. Consulte a seção Recomendações para soluções alternativas.

Problemas conhecidos

1. Inserções de dados JSON

As inserções de dados JSON não estão sendo tratadas corretamente pelo SnowConvert.

2. Manipulação de objetos JSON

Os usos de objetos JSON (colunas, variáveis ou parâmetros) não são convertidos corretamente pelo SnowConvert AI. Consulte a seção Recomendações para soluções alternativas

Recomendações

1. JSON Data Type translation workaround

O tipo de dados JSON é convertido para VARIANT, de modo que as informações podem ser formatadas usando a do função Snowflake PARSE_JSON. Essa abordagem permitirá que você armazene, consulte e opere os dados do JSON no Snowflake usando uma sintaxe semelhante à do Oracle.

Oracle
CREATE TABLE jsontable (
	json_column JSON
);

INSERT INTO jsontable VALUES('{"id": 1, "content":"json content"}');
INSERT INTO jsontable VALUES('{"id": 2, "content": {"header": "header text one", "content": "content text one"}}');
INSERT INTO jsontable VALUES('{"id": 3, "content": {"header": "header tex two", "content": "content text two"}}');

SELECT * FROM jsontable;
SELECT 'ID: ' || jt.json_column.id, 'HEADER: ' || UPPER(jt.json_column.content.header) FROM jsontable jt;
Copy
Resultado 1

JSON_SERIALIZE(JSON_COLUMN)

{«id»:1,»content»:»json content»}

{«id»:2,»content»:{«header»:»header text one»,»content»:»content text one»}}

{«id»:3,»content»:{«header»:»header tex two»,»content»:»content text two»}}

Resultado 2

“ID:” JT.JSON_COLUMN.ID

“HEADER:” UPPER(JT.JSON_COLUMN.CONTENT.HEADER)

ID: 1

HEADER:

ID: 2

HEADER: «HEADER TEXT ONE»

ID: 3

HEADER: «HEADER TEX TWO»

Snowflake
CREATE OR REPLACE TABLE jsontable (
	json_column VARIANT
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;

INSERT INTO jsontable
VALUES('{"id": 1, "content":"json content"}');

INSERT INTO jsontable
VALUES('{"id": 2, "content": {"header": "header text one", "content": "content text one"}}');

INSERT INTO jsontable
VALUES('{"id": 3, "content": {"header": "header tex two", "content": "content text two"}}');

SELECT * FROM
	jsontable;

SELECT 'ID: ' || NVL(jt.json_column.id :: STRING, ''), 'HEADER: ' || NVL(UPPER(jt.json_column.content.header) :: STRING, '') FROM
	jsontable jt;
Copy
Resultado 1

JSON_COLUMN

{ «content»: «json content», «id»: 1}

{ «content»: { «content»: «content text one», «header»: «header text one» }, «id»: 2}

{ «content»: { «content»: «content text two», «header»: «header tex two» }, «id»: 3}

Resultado 2

“ID: “ JT.JSON_COLUMN:ID

“HEADER: “ UPPER(JT.JSON_COLUMN:CONTENT:HEADER)

ID: 1

ID: 2

HEADER: HEADER TEXT ONE

ID: 3

HEADER: HEADER TEX TWO

Nota

Você deve usar SELECT como o argumento INSERT INTO em vez da cláusula VALUES para usar a função PARSE_JSON.

Nota

Use o operador “:” em vez de “.” para acessar as propriedades do objeto JSON. Ele permite vários níveis de aninhamento em ambos os mecanismos.

EWIs relacionados

  1. SSC-EWI-0073: Revisão de equivalência funcional pendente

Tipo de dados LONG

LONG armazena cadeias de caracteres de comprimento variável contendo até 2 gigabytes -1, ou 231-1 bytes. As colunas LONG têm muitas das características das colunas VARCHAR2. Você pode usar as colunas LONG para armazenar sequências de texto longas. O comprimento dos valores de LONG pode ser limitado pela memória disponível em seu computador. (Tipo de dados Long da referência de linguagem Oracle SQL)

LONG
Copy

Amostra de padrões da origem

Long em Create Table

Oracle
CREATE TABLE long_table
( 
     id 	  NUMBER,
     long_column  LONG
);
     
 INSERT INTO long_table VALUES (1, 'this is a text');
Copy
Snowflake
CREATE OR REPLACE TABLE long_table
 (
      id NUMBER(38, 18) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/,
      long_column VARCHAR
 )
 COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
 ;

 INSERT INTO long_table
 VALUES (1, 'this is a text');
Copy

Recuperação de dados de uma coluna Long

Oracle
SELECT long_column FROM long_table;
Copy
Resultado

LONG_COLUMN

isto é um texto

Snowflake
SELECT long_column FROM
long_table;
Copy
Resultado

LONG_COLUMN

isto é um texto

Problemas conhecidos

1. The max length of long (Oracle) and varchar (Snowflake) are different

De acordo com a documentação do Oracle, a coluna Long pode armazenar até 2 gigabytes de dados, mas o varchar do Snowflake é limitado a 16 Mb.

2. Cast of Long column

O tipo de dados Long só pode ser convertido para o tipo de dados CLOB, e a única maneira de conseguir isso é usando a função [TO_LOB ](https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/TO_LOB. html#GUID-35810313-029E-4CB8-8C27-DF432FA3C253), essa função só funciona se for usada na lista de seleção de uma subconsulta em uma instrução INSERT. Considere a seguinte amostra

Oracle
CREATE TABLE target_table (col CLOB);

INSERT INTO target_table (SELECT TO_LOB(long_column) FROM long_table);
Copy

Aviso

Se o tipo de dados da coluna da tabela de destino for diferente de CLOB, o Oracle poderá inserir valores nulos ou exibir um erro ao tentar inserir os dados.

EWIs relacionados

  1. SSC-FDM-0006: a coluna do tipo Number pode não se comportar da mesma forma no Snowflake.

Tipos de dados RAW e LONG RAW

Descrição

Os tipos de dados RAW e LONG RAW armazenam dados que não devem ser convertidos explicitamente pelo Oracle Database ao mover dados entre sistemas diferentes. Esses tipos de dados são destinados a dados binários ou cadeias de bytes. (Tipos de dados brutos Row e Long da referência de linguagem Oracle SQL)

{ LONG RAW | RAW (size) }
Copy

Amostra de padrões da origem

Raw e Long Raw em Create Table

Oracle
CREATE TABLE raw_table
(    
     id INTEGER,
     raw_column RAW(2000),
     long_raw_column LONG RAW
);
  
INSERT  INTO raw_table values(1, 'FF00FF00FF', 'FF00FF00FFAABAABABABABA917843210984237123ABABABABAABBAAABBACDFFD');
INSERT  INTO raw_table values(2, 'AAAAAAAAAA', 'ABABABABABABABABABABABABABABABAbABAbABAABABAAABABABABABABABABABABA');
--Insert with largest string posible (2000 HEX characters) 
INSERT INTO raw_table VALUES (3, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA')
Copy
Snowflake CREATE OR REPLACE TABLE raw_table
CREATE OR REPLACE TABLE raw_table
     (
          id INTEGER,
          raw_column BINARY,
          long_raw_column BINARY
     )
     COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
     ;

     INSERT  INTO raw_table
     values(1, 'FF00FF00FF', 'FF00FF00FFAABAABABABABA917843210984237123ABABABABAABBAAABBACDFFD');

     INSERT  INTO raw_table
     values(2, 'AAAAAAAAAA', 'ABABABABABABABABABABABABABABABAbABAbABAABABAAABABABABABABABABABABA');

     --Insert with largest string posible (2000 HEX characters) 
INSERT INTO raw_table
     VALUES (3, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA');
Copy

Recuperação de dados da coluna Raw e Long Raw

Oracle
SELECT * FROM raw_table ORDER BY id;
Copy
Resultado

ID

RAW_COLUMN

LONG_RAW_COLUMN

1

ªº««««© 2 B7 :ºººº«ºª»¬ßý

2

ªªªªª

«««««««««««««««««««ªººªºººººººººº

3

ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª

ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª

Snowflake
SELECT * FROM
raw_table
ORDER BY id;
Copy
Resultado

ID

RAW_COLUMN

LONG_RAW_COLUMN

1

ªº««««© 2 B7 :ºººº«ºª»¬ßý

2

ªªªªª

«««««««««««««««««««ªººªºººººººººº

3

ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª

ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª

Problemas conhecidos

Não foram encontrados problemas.

EWIs relacionados

Sem EWIs relacionados.

Tipos de dados numéricos

Descrição

Os tipos de dados numéricos do Oracle Database armazenam números fixos e de ponto flutuante positivos e negativos, zero, infinito e valores que são o resultado indefinido de uma operação, “não é um número” ou NAN. (Tipos de dados numéricos de referência da linguagem Oracle)

Notas sobre operações aritméticas

Esteja ciente de que toda operação realizada em tipos de dados numéricos é armazenada internamente como um número. Além disso, dependendo da operação executada, é possível incorrer em um erro relacionado à forma como os valores intermediários são armazenados no Snowflake. Para mais informações, consulte postagem do Snowflake sobre números intermediários no Snowflake.

Tipo de dados FLOAT

Descrição

O tipo de dados FLOAT é um subtipo de NUMBER. Ele pode ser especificado com ou sem precisão, que tem a mesma definição deNUMBERe pode variar de 1 a 126. A escala não pode ser especificada, mas é interpretada a partir dos dados. (Tipo de dados Float da referência de linguagem Oracle)

Aviso

Notes on arithmetic operations

Lembre-se de que toda operação realizada em tipos de dados numéricos é armazenada internamente como um número. Além disso, dependendo da operação realizada, é possível incorrer em um erro relacionado à forma como os valores intermediários são armazenados no Snowflake. Para obter mais informações, consulte esta postagem sobre números intermediários no Snowflake.

Amostra de padrões da origem

Considere a tabela a seguir e suas inserções para os exemplos abaixo:

Tipo de dados Float em Create Table

Oracle
CREATE TABLE float_data_type_table(
col1 FLOAT,
col2 FLOAT(5),
col3 FLOAT(126)
);

INSERT INTO float_data_type_table (col1) VALUES (100.55555);
INSERT INTO float_data_type_table (col1) VALUES (1.9);
INSERT INTO float_data_type_table (col2) VALUES (1.23);
INSERT INTO float_data_type_table (col2) VALUES (7.89);
INSERT INTO float_data_type_table (col2) VALUES (12.79);
INSERT INTO float_data_type_table (col2) VALUES (123.45);
INSERT INTO float_data_type_table (col3) VALUES (1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111.99999999999999999999555555);
Copy
Snowflake
CREATE OR REPLACE TABLE float_data_type_table (
col1 FLOAT,
col2 FLOAT(5),
col3 FLOAT(126)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;

INSERT INTO float_data_type_table(col1) VALUES (100.55555);

INSERT INTO float_data_type_table(col1) VALUES (1.9);

INSERT INTO float_data_type_table(col2) VALUES (1.23);

INSERT INTO float_data_type_table(col2) VALUES (7.89);

INSERT INTO float_data_type_table(col2) VALUES (12.79);

INSERT INTO float_data_type_table(col2) VALUES (123.45);

INSERT INTO float_data_type_table(col3) VALUES (1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111.99999999999999999999555555);
Copy

FLOAT

Não há diferenças entre o Oracle e o Snowflake com relação ao tipo de dados FLOAT sem precisão.

Oracle
SELECT col1 FROM float_data_type_table;
Copy
Resultado

col1

100.55555

1.9

Snowflake
SELECT col1 FROM
float_data_type_table;
Copy
Resultado

col1

100.55555

1.9

FLOAT ( p )

Os resultados das consultas podem não ser equivalentes quando a precisão (p) for especificada no tipo de dadosFLOAT. Há pequenas diferenças de arredondamento.

Oracle
SELECT col2 FROM float_data_type_table;

SELECT col3 FROM float_data_type_table;
Copy
Resultado

col2

1,2

7,9

13

120

col3

—————————————————————————————————-

1111111111111111111111111111111111111100000000000000000000000000000000000000000000000000000000000000

Snowflake
SELECT col2 FROM
float_data_type_table;

SELECT col3 FROM
float_data_type_table;
Copy
Resultado

col2

1,23

7,89

12,79

123,45

col3

—————————————————————————————————-

1111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Problemas conhecidos

1. FLOAT data type with precision

Quando o tipo de dados FLOAT tem precisão, os resultados das consultas podem ter pequenas diferenças de arredondamento.

EWIs relacionados

Sem EWIs relacionados.

Tipo de dados NUMBER

Descrição

O tipo de dados NUMBER armazena zero, bem como números fixos positivos e negativos com valores absolutos de 1,0 x 10-130 até 1,0 x 10126, mas não incluindo esse valor. Se você especificar uma expressão aritmética cujo valor tenha um valor absoluto maior ou igual a 1,0 x 10126, o Oracle retornará um erro. Cada valor de NUMBER requer de 1 a 22 bytes. (Tipo de dados Number da referência de linguagem Oracle).

O tipo de dados NUMBER pode ser especificado usando o seguinte formulário NUMBER(p, s) (ambos os parâmetros são opcionais) onde:

  • p é a precisão **** ou o número máximo de dígitos decimais significativos, em que o dígito mais significativo é o dígito não nulo mais à esquerda e o dígito menos significativo é o dígito conhecido mais à direita. A precisão pode variar de 0 a 38.

  • s é a escala ou o número de dígitos do ponto decimal até o dígito menos significativo. A escala pode variar de -84 a 127.

No Oracle, não especificar a precisão (usando NUMBER ou NUMBER(*)) faz com que a coluna seja criada como uma «precisão indefinida». Isso significa que o Oracle armazenará valores dinamicamente, permitindo armazenar qualquer número nessa coluna. O Snowflake não oferece suporte a essa funcionalidade; por esse motivo, eles serão alterados para NUMBER(38, 18), permitindo armazenar a mais ampla variedade de números.

Aviso

Notes on arithmetic operations

Esteja ciente de que toda operação realizada em tipos de dados numéricos é armazenada internamente como um número. Além disso, dependendo da operação realizada, é possível incorrer em um erro relacionado à forma como os valores intermediários são armazenados no Snowflake. Para mais informações, consulte esta postagem do Snowflake sobre números intermediários no Snowflake ou consulte a mensagem de equivalência funcional SSC-FDM-0006.

Amostra de padrões da origem

Considere a tabela a seguir e suas inserções para os exemplos abaixo:

Tipos de dados Number em Create Table

Oracle
CREATE TABLE number_data_type_table
(
col1 NUMBER,
col2 NUMBER(1),
col3 NUMBER(10, 5),
col4 NUMBER(5, -2),
col5 NUMBER(4, 5)
);

INSERT INTO number_data_type_table(COL1) VALUES(100);
INSERT INTO number_data_type_table(COL2) VALUES(1.99999);
INSERT INTO number_data_type_table(COL3) VALUES(12345.12345);
INSERT INTO number_data_type_table(COL4) VALUES(16430.55555);
INSERT INTO number_data_type_table (COL4) VALUES(17550.55555);
INSERT INTO number_data_type_table(COL5) VALUES(0.00009);
INSERT INTO number_data_type_table(COL5) VALUES(0.000021);
INSERT INTO number_data_type_table(COL5) VALUES(0.012678912);
Copy
Snowflake
CREATE OR REPLACE TABLE number_data_type_table
(
col1 NUMBER(38, 18) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/,
col2 NUMBER(1) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/,
col3 NUMBER(10, 5) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/,
col4 NUMBER(5) !!!RESOLVE EWI!!! /*** SSC-EWI-OR0092 - NUMBER DATATYPE NEGATIVE SCALE WAS REMOVED FROM OUTPUT ***/!!! /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/,
col5 NUMBER(5, 5) /*** SSC-FDM-OR0010 - NUMBER DATATYPE SMALLER PRECISION WAS INCREASED TO MATCH SCALE ***/ /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;

INSERT INTO number_data_type_table(COL1) VALUES(100);

INSERT INTO number_data_type_table(COL2) VALUES(1.99999);

INSERT INTO number_data_type_table(COL3) VALUES(12345.12345);

INSERT INTO number_data_type_table(COL4) VALUES(16430.55555);

INSERT INTO number_data_type_table(COL4) VALUES(17550.55555);

INSERT INTO number_data_type_table(COL5) VALUES(0.00009);

INSERT INTO number_data_type_table(COL5) VALUES(0.000021);

INSERT INTO number_data_type_table(COL5) VALUES(0.012678912);
Copy

NUMBER ( caso padrão )

Quando a precisão e a escala não são especificadas, os valores padrão são os máximos disponíveisNUMBER(38, 127). A transformação atual para o caso padrão é NUMBER(38,19).

Aviso

No Oracle, a não definição de Precision nem de Scale tem como padrão «Undefined Precision and Scale». Ele se comporta armazenando a entrada «como recebida», o que significa que pode lidar com números inteiros e de ponto flutuante. Usamos 38, 18 para tentar cobrir ambos, usando 20 para números inteiros e deixando 18 para dígitos de ponto flutuante.

Oracle
SELECT col1 FROM number_data_type_table;
Copy
Resultado

col1

100

Snowflake
SELECT col1 FROM
number_data_type_table;
Copy
Resultado

col1

100,0000000000000000000

NUMBER ( p )

Nesse caso, a precisão especificará o número de dígitos que o número pode ter à esquerda do ponto decimal.

Oracle
SELECT col2 FROM number_data_type_table;
Copy
Resultado

col2

2

Snowflake
SELECT col2 FROM
number_data_type_table;
Copy
Resultado

col2

2

NUMBER ( p, s ) p > s

No caso de s ser menor que p, a precisão especificará o número de dígitos que o número pode ter. A escala especificará o número de dígitos significativos à direita do ponto decimal, de modo que o número de dígitos à esquerda do ponto decimal dependerá da escala especificada.

Oracle
SELECT col3 FROM number_data_type_table;
Copy
Resultado

col3

12345,12345

Snowflake
SELECT col3 FROM
number_data_type_table;
Copy
Resultado

col3

12345,12345

NUMBER ( p, -s )

Uma escala negativa é o número de dígitos significativos à esquerda do ponto decimal, até o dígito menos significativo, mas não o incluindo. Para a escala negativa, o dígito menos significativo está no lado esquerdo do ponto decimal, porque os dados reais são arredondados para o número especificado de casas à esquerda do ponto decimal. A transformação atual é para remover a escala negativa.

Oracle
SELECT col4 FROM number_data_type_table;
Copy
Resultado

col4

16400

17600

Snowflake
SELECT col4 FROM
number_data_type_table;
Copy
Resultado

col4

16431

17551

NUMBER ( p, s ) s > p

Quando a escala for maior do que a precisão, considere os seguintes aspectos:

  • O número a ser inserido não pode ter dígitos significativos à esquerda do ponto decimal. Apenas zero está disponível.

  • O primeiro dígito à direita do ponto decimal deve ser zero.

  • A precisão especifica o número máximo de dígitos significativos à direita do ponto decimal.

Oracle
SELECT col5 FROM number_data_type_table;
Copy
Resultado

col5

0,00009

0,00002

0,01268

Snowflake
SELECT col5 FROM
number_data_type_table;
Copy
Resultado

col5

0,00009

0,00002

0,01268

Problemas conhecidos

1. Scale value exceeds the maximum allowed by Snowflake

Ao especificar uma escala maior que o máximo permitido no Snowflake (37), ela é alterada para 18. Para obter mais informações sobre isso, acesse a documentação SSC-FDM-0006.

2. Negative scale

O Snowflake não permite escala negativa, por isso está sendo removido. Isso podia causar inequivalência funcional. Para obter mais informações sobre isso, acesse a documentação SSC-EWI-0R0092.

Recomendações

1. UDF for NUMBER datatype Operations

É possível migrar essas operações manualmente usando o próximo UDF ao realizar operações aritméticas para evitar os problemas observados:

UDF
CREATE OR REPLACE FUNCTION fixed_divide(a NUMBER(38,19), b NUMBER(38,19))
RETURNS NUMBER(38,19)
LANGUAGE JAVA
CALLED ON NULL INPUT
HANDLER='TestFunc.divide'
AS
'
import java.math.BigDecimal;
import java.math.RoundingMode;
class TestFunc {
public static BigDecimal divide(BigDecimal a, BigDecimal b) {
return a.divide(b,RoundingMode.HALF_UP);
}
}';
Copy

EWIs relacionados

  1. SSC-EWI-OR0092 A escala negativa do tipo de dados numéricos foi removida da saída.

  2. SSC-FDM-0006: a coluna do tipo Number pode não se comportar da mesma forma no Snowflake.

  3. SSC-FDM-OR0010 A precisão menor do tipo de dados numéricos foi aumentada para corresponder à escala.

Números de ponto flutuante

Descrição

Os números de ponto flutuante podem ter um ponto decimal em qualquer parte do primeiro até o último dígito, ou podem não ter ponto decimal nenhum. Um expoente pode opcionalmente ser usado seguindo o número para aumentar o intervalo, por exemplo, 1,777 e-20. Um valor de escala não é aplicável aos números de ponto flutuante, porque o número de dígitos que podem aparecer após o ponto decimal não é restrito. Os números de ponto flutuante binários são armazenados usando precisão binária (os dígitos 0 e 1) (Números de ponto flutuante da referência de linguagem Oracle)

BINARY_DOUBLE

Descrição

BINARY_DOUBLE é um tipo de dados de número de ponto flutuante de precisão dupla de 64 bits. Cada valor de BINARY_DOUBLE requer 8 bytes. Em uma coluna BINARY_DOUBLE, os números de ponto flutuante têm precisão binária. Os números de ponto flutuante binário suportam os valores especiais infinito e NaN (não é um número). (Tipo de dados Binary_Double do Oracle)

É possível especificar números de ponto flutuante dentro dos limites a seguir:

  • Valor finito positivo máximo = 1.79769313486231E+308

  • Valor finito mínimo positivo = 2.22507485850720E-308

Amostra de padrões da origem

Considere a tabela a seguir e suas inserções para o exemplo abaixo:

Binary Double em Create Table

Oracle
CREATE TABLE binary_double_data_type_table
(
COL1 BINARY_DOUBLE
);

INSERT INTO binary_double_data_type_table VALUES(2.22507485850720E-308D);
INSERT INTO binary_double_data_type_table VALUES(1.79769313486231E+308D);
INSERT INTO binary_double_data_type_table VALUES('NaN');
Copy
Snowflake
CREATE OR REPLACE TABLE binary_double_data_type_table
(
COL1 FLOAT
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;

INSERT INTO binary_double_data_type_table
VALUES(2.22507485850720E-308);

INSERT INTO binary_double_data_type_table
VALUES(1.79769313486231E+308);

INSERT INTO binary_double_data_type_table
VALUES('NaN');
Copy

Nota

“NaN” significa _ Não é um número _, esse valor é permitido pelo tipo de dadosBINARY_DOUBLE no Oracle e pelo tipo de dadosFLOATno Snowflake.

BINARY_DOUBLE -> FLOAT

Como o tipo de dadosBINARY_DOUBLEnão é compatível com o Snowflake, ele está sendo convertido para FLOAT.

Oracle
SELECT * FROM binary_double_data_type_table;
Copy
Resultado

col1

0

179769313486231000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

NaN

Snowflake
SELECT * FROM
binary_double_data_type_table;
Copy
Resultado

col1

0

179769313486231000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

NaN

Problemas conhecidos

1. The BINARY_DOUBLE data type is not supported by Snowflake

O tipo de dados BINARY_DOUBLE é convertido para FLOAT, pois não é compatível com o Snowflake.

EWIs relacionados

Sem EWIs relacionados.

BINARY_FLOAT

Descrição

BINARY_FLOAT é um tipo de dados de número de ponto flutuante de precisão única de 32 bits. Cada valor deBINARY_FLOATrequer 4 bytes. Em uma coluna BINARY_FLOAT, os números de ponto flutuante têm precisão binária. Os números de ponto flutuante binário suportam os valores especiais infinito e NaN (não é um número). (Tipo de dados Binary_Float do Oracle)

É possível especificar números de ponto flutuante dentro dos limites a seguir:

  • Valor finito positivo máximo = 3.40282E+38F

  • Valor finito mínimo positivo = 1.17549E-38F

Amostra de padrões da origem

Considere a tabela a seguir e suas inserções para o exemplo abaixo:

Binary Float em Create Table

Oracle
CREATE TABLE binary_float_data_type_table
(
col1 BINARY_FLOAT
);

INSERT INTO binary_float_data_type_table VALUES(1.17549E-38F);
INSERT INTO binary_float_data_type_table VALUES(3.40282E+38F);
INSERT INTO binary_float_data_type_table VALUES('NaN');
Copy
Snowflake
CREATE OR REPLACE TABLE binary_float_data_type_table
(
col1 FLOAT
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;

INSERT INTO binary_float_data_type_table
VALUES(1.17549E-38);

INSERT INTO binary_float_data_type_table
VALUES(3.40282E+38);

INSERT INTO binary_float_data_type_table
VALUES('NaN');
Copy

Nota

“NaN” significa _ Não é um número _, esse valor é permitido pelo tipo de dadosBINARY_FLOAT no Oracle e pelo tipo de dadosFLOATno Snowflake.

BINARY_FLOAT -> FLOAT

Como o tipo de dadosBINARY_FLOATnão é compatível com o Snowflake, ele está sendo convertido para FLOAT.

Oracle
SELECT * FROM binary_float_data_type_table;
Copy
Resultado

col1

0

340282001837565600000000000000000000000

NaN

Snowflake
SELECT * FROM binary_float_data_type_table;
Copy
Resultado

col1

0

340282000000000000000000000000000000000

NaN

Problemas conhecidos

1. The BINARY_FLOAT data type is not supported by Snowflake

O tipo de dados BINARY_FLOAT é convertido para FLOAT, pois não é compatível com o Snowflake.

EWIs relacionados

Sem EWIs relacionados.

Tipos de dados Datetime e Interval

Os tipos de dados datetime são DATE, TIMESTAMP, TIMESTAMP WITH TIME ZONEe TIMESTAMP WITH LOCAL TIME ZONE. Os valores de tipos de dados datetime às vezes são chamados de datetimes. Os tipos de dados de intervalo são INTERVAL YEAR TO MONTH e INTERVAL DAY TO SECOND. Os valores de tipos de dados interval às vezes são chamados de intervals. (Tipos de dados Datetime e Interval da referência de linguagem Oracle SQL)

Tipo de dados DATE

Descrição

O tipo de dados de data da Oracle armazena informações de data e hora, mas o tipo de dados de data do Snowflake armazena apenas informações de data. (Tipo de dados de data da referência de linguagem Oracle SQL)

A transformação padrão para DATE do Oracle é para TIMESTAMP do Snowflake. Você pode adicionar o sinalizador disableDateAsTimestamp (interface de linha de comando do SnowConvert AI) ou desabilitar a configuração Transformar data em carimbo de data/hora (aplicativo desktop SnowConvert AI) a fim de transformar o tipo DATE em TIMESTAMP. Tenha em mente que o DATE do Snowflake só armazena informações de data e o Oracle armazena informações de data e hora. Se você quiser evitar perder informações, deve transformar DATE em TIMESTAMP.

Nota

Diferença importante de comportamento de arredondamento: ao realizar operações entre os tipos de dados date/timestamp e intervalos envolvendo segundos, o Oracle não arredonda os segundos, mas preserva a precisão conforme especificado, enquanto o Snowflake arredonda os segundos para o segundo inteiro mais próximo. Essa diferença no comportamento de arredondamento pode levar a resultados diferentes.

Amostra de padrões da origem

Date em Create Table

Oracle
CREATE TABLE date_table
(
	date_col date
);

INSERT INTO date_table(date_col) VALUES (DATE '2010-10-10');
Copy
Snowflake sem sinalizador –disableDateAsTimestamp ou com a configuração «Transform Date as Timestamp» ativada
CREATE OR REPLACE TABLE date_table
	(
		date_col TIMESTAMP /*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/
	)
	COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
	;

	INSERT INTO date_table(date_col) VALUES (DATE '2010-10-10');
Copy
Snowflake com sinalizador –disableDateAsTimestamp ou com a configuração «Transform Date as Timestamp» desativada
CREATE OR REPLACE TABLE date_table
	(
		date_col date
	)
	COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
	;

	INSERT INTO date_table(date_col) VALUES (DATE '2010-10-10');
Copy

Recuperação de dados de uma coluna Date

Oracle
SELECT date_col FROM date_table;
Copy
Resultado

DATE_COL

2010-10-10 00:00:00.000

Snowflake
SELECT date_col FROM
date_table;
Copy
Resultado

DATE_COL

2010-10-10 00:00:00.000

Resultado com sinalizador disableDateAsTimestamp

DATE_COL

2010-10-10

Problemas conhecidos

1. Input and output format may differ between languages

No Snowflake, os formatos de entrada e saída DATE dependem das variáveis de sessão DATE_INPUT_FORMAT e DATE_OUTPUT_FORMAT. As inserções podem falhar porque DATE_INPUT_FORMAT obriga o usuário a usar um formato específico quando uma data é adicionada por texto. Você pode modificar essas variáveis usando a seguinte sintaxe.

ALTER SESSION SET DATE_INPUT_FORMAT = 'YYYY-DD-MM' DATE_OUTPUT_FORMAT = 'DD-MM-YYYY';
Copy

EWIs relacionados

  1. SSC-FDM-OR0042: o tipo Date transformado em Timestamp tem um comportamento diferente

Tipo de dados INTERVALDAYTOSECOND

Descrição

INTERVAL DAY TO SECOND armazena um período de tempo em termos de dias, horas, minutos e segundos. (Tipo de dados INTERVAL DAY TO SECOND da referência de linguagem Oracle SQL)

Não há equivalente para esse tipo de dados no Snowflake; atualmente, ele é transformado em VARCHAR.

INTERVAL DAY [(day_precision)] TO SECOND [(fractional_seconds_precision)]
Copy

Amostra de padrões da origem

Interval Day to Second em Create Table

Oracle
CREATE TABLE interval_day_to_second_table
(
	interval_day_col1 interval day to second,
	interval_day_col2 interval day(1) to second(4)
);

INSERT INTO interval_day_to_second_table(interval_day_col1) VALUES ( INTERVAL '1 2:3:4.56' DAY TO SECOND ); 
INSERT INTO interval_day_to_second_table(interval_day_col2) VALUES ( INTERVAL '1 2:3:4.56' DAY(1) TO SECOND(4) );
Copy
Snowflake
CREATE OR REPLACE TABLE interval_day_to_second_table
	(
		interval_day_col1 VARCHAR(20) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL day to second DATA TYPE CONVERTED TO VARCHAR ***/!!!,
		interval_day_col2 VARCHAR(20) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL day(1) to second(4) DATA TYPE CONVERTED TO VARCHAR ***/!!!
	)
	COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
	;

	INSERT INTO interval_day_to_second_table(interval_day_col1) VALUES ('1d, 2h, 3m, 4s, 56ms');

	INSERT INTO interval_day_to_second_table(interval_day_col2) VALUES ('1d, 2h, 3m, 4s, 56ms');
Copy

O valor do intervalo é transformado em um formato compatível com o Snowflake e, em seguida, inserido como texto dentro da coluna. Como o Snowflake não oferece suporte a Interval como um tipo de dados, ele só é compatível com operações aritméticas. Para usar o valor, ele precisa ser extraído e usado como uma constante de intervalo (se possível).

Valor original Oracle: INTERVAL '1 2:3:4.567' DAY TO SECOND

Valor armazenado na coluna Snowflake: '1d, 2h, 3m, 4s, 567ms'

Valor como constante do Snowflake Interval: INTERVAL '1d, 2h, 3m, 4s, 567ms'

Recuperação de dados de uma coluna Interval Day to Second

Oracle
SELECT * FROM interval_day_to_second_table;
Copy
Resultado

INTERVAL_DAY_COL1

INTERVAL_DAY_COL2

1 2:3:4.567

1 2:3:4.567

Snowflake
SELECT * FROM
interval_day_to_second_table;
Copy
Resultado

INTERVAL_DAY_COL1

INTERVAL_DAY_COL2

1d, 2h, 3m, 4s, 56ms

1d, 2h, 3m, 4s, 56ms

Problemas conhecidos

1. Only arithmetic operations are supported

Os intervalos do Snowflake têm várias limitações. Somente operações aritméticas entre DATE ou TIMESTAMP e constantes de intervalo são suportadas; qualquer outro cenário não é suportado.

EWIs relacionados

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

Tipo de dados INTERVALYEARTOMONTH

Descrição

INTERVAL YEAR TO MONTH armazena um período de tempo usando os campos de data e hora YEAR e MONTH. Como não há equivalente no Snowflake, ele é transformado em Varchar (Tipo de dados INTERVAL YEAR TO MONTH da referência de linguagem Oracle SQL)

Não há equivalente para esse tipo de dados no Snowflake; atualmente, ele é transformado em VARCHAR.

INTERVAL YEAR [(year_precision)] TO MONTH
Copy

Amostra de padrões da origem

Interval Year To Month em Create Table

Oracle
CREATE TABLE interval_year_to_month_table
(
	interval_year_col1 interval year to month,
	interval_year_col2 interval year(4) to month
);

INSERT INTO interval_year_to_month_table(interval_year_col1) VALUES ( INTERVAL '1-2' YEAR TO MONTH ); 
INSERT INTO interval_year_to_month_table(interval_year_col2) VALUES ( INTERVAL '1000-11' YEAR(4) TO MONTH );
Copy
Snowflake
CREATE OR REPLACE TABLE interval_year_to_month_table
	(
		interval_year_col1 VARCHAR(20) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL year to month DATA TYPE CONVERTED TO VARCHAR ***/!!!,
		interval_year_col2 VARCHAR(20) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL year(4) to month DATA TYPE CONVERTED TO VARCHAR ***/!!!
	)
	COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
	;

	INSERT INTO interval_year_to_month_table(interval_year_col1) VALUES ('1y, 2mm');

	INSERT INTO interval_year_to_month_table(interval_year_col2) VALUES ('1000y, 11mm');
Copy

O valor do intervalo é transformado em um formato compatível com o Snowflake e, em seguida, inserido como texto dentro da coluna. Como o Snowflake não oferece suporte a Interval como um tipo de dados, ele só é compatível com operações aritméticas. Para usar o valor, ele precisa ser extraído e usado como uma constante de intervalo (se possível).

Valor original Oracle: INTERVAL '1-2' YEAR TO MONTH

Valor armazenado na coluna Snowflake: '1y, 2m'

Valor como constante do Snowflake Interval: INTERVAL '1y, 2m'

Recuperação de dados de uma coluna Interval Year To Month

Oracle
SELECT * FROM interval_year_to_month_table;
Copy
Resultado

INTERVAL_YEAR_COL1

INTERVAL_YEAR_COL2

1-2

1000-11

Snowflake
SELECT * FROM
interval_year_to_month_table;
Copy
Resultado

INTERVAL_YEAR_COL1

INTERVAL_YEAR_COL2

1y, 2m

              |1000y, 11m        |
Copy

Problemas conhecidos

1. Only arithmetic operations are supported

Os intervalos do Snowflake têm várias limitações. Somente operações aritméticas entre DATE ou TIMESTAMP e constantes de intervalo são suportadas; qualquer outro cenário não é suportado.

EWIs relacionados

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

Tipo de dados TIMESTAMP

Descrição

O tipo de dados TIMESTAMP é uma extensão do tipo de dados DATE. Ele armazena o ano, o mês e o dia do tipo de dados DATE, além dos valores de hora, minuto e segundo. (Tipo de dados Timestamp da referência de linguagem Oracle SQL)

Os tipos de dados Oracle e Snowflake TIMESTAMP têm o mesmo intervalo de precisão (0-9), mas valores padrão diferentes. No Oracle, o valor de precisão padrão é 6 e no Snowflake é 9.

No entanto, há uma diferença de comportamento quando um valor inserido excede a precisão definida. O Oracle arredonda as casas decimais excedentes, enquanto o Snowflake apenas apara os valores.

TIMESTAMP [(fractional_seconds_precision)] 
Copy

Amostra de padrões da origem

Timestamp em Create Table

Oracle
CREATE TABLE timestamp_table
(
	timestamp_col1 TIMESTAMP,
	timestamp_col2 TIMESTAMP(7)
);

INSERT INTO timestamp_table(timestamp_col1, timestamp_col2) VALUES (TIMESTAMP '2010-10-10 12:00:00', TIMESTAMP '2010-10-10 12:00:00');
Copy
Snowflake
CREATE OR REPLACE TABLE timestamp_table
	(
		timestamp_col1 TIMESTAMP(6),
		timestamp_col2 TIMESTAMP(7)
	)
	COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
	;

	INSERT INTO timestamp_table(timestamp_col1, timestamp_col2) VALUES (TIMESTAMP '2010-10-10 12:00:00', TIMESTAMP '2010-10-10 12:00:00');
Copy

Recuperação de dados de uma coluna Timestamp

Oracle
SELECT * FROM timestamp_table;
Copy
Resultado

TIMESTAMP_COL1

TIMESTAMP_COL2

2010-10-10 12:00:00.000

2010-10-10 12:00:00.000

Snowflake
SELECT * FROM
timestamp_table;
Copy
Resultado

TIMESTAMP_COL1

TIMESTAMP_COL2

2010-10-10 12:00:00.000

2010-10-10 12:00:00.000

Problemas conhecidos

Não foram encontrados problemas.

EWIs relacionados

Sem EWIs relacionados.

Tipo de dados TIMESTAMPWITHLOCALTIMEZONE

Descrição

Ele difere de TIMESTAMP WITH TIME ZONE porque os dados armazenados no banco de dados são normalizados para o fuso horário do banco de dados e as informações sobre o fuso horário não são armazenadas como parte dos dados da coluna. (Tipo de dados Timestamp with Local Time Zone Data da referência de linguagem Oracle SQL)

O equivalente ao Snowflake é TIMESTAMP_LTZ.

Para obter mais informações, consulte também a seção TIMESTAMP.

TIMESTAMP [(fractional_seconds_precision)] WITH LOCAL TIME ZONE

Copy

Amostra de padrões da origem

Timestamp with Time Zone em Create Table

Oracle
CREATE TABLE timestamp_with_local_time_zone_table
(
	timestamp_col1 TIMESTAMP(5) WITH LOCAL TIME ZONE
);

INSERT INTO timestamp_with_local_time_zone_table(timestamp_col1) VALUES (TIMESTAMP '2010-10-10 12:00:00');
INSERT INTO timestamp_with_local_time_zone_table(timestamp_col1) VALUES (TIMESTAMP '2010-10-10 12:00:00 -08:00');
Copy
Snowflake
CREATE OR REPLACE TABLE timestamp_with_local_time_zone_table
	(
		timestamp_col1 TIMESTAMP_LTZ(5)
	)
	COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
	;

	INSERT INTO timestamp_with_local_time_zone_table(timestamp_col1) VALUES (TIMESTAMP '2010-10-10 12:00:00');

	INSERT INTO timestamp_with_local_time_zone_table(timestamp_col1) VALUES (TIMESTAMP '2010-10-10 12:00:00 -08:00');
Copy

Recuperação de dados de uma coluna Timestamp com fuso horário local

Oracle
SELECT * FROM timestamp_with_local_time_zone_table;
Copy
Resultado

TIMESTAMP_COL1

2010-10-10 18:00:00.000

2010-10-10 20:00:00.000

Snowflake
SELECT * FROM
timestamp_with_local_time_zone_table;
Copy
Resultado

TIMESTAMP_COL1

2010-10-10 12:00:00.000 -0700

2010-10-10 12:00:00.000 -0700

Nota

Observe que os resultados são diferentes nos dois mecanismos porque cada banco de dados é definido com um fuso horário diferente. O fuso horário do Oracle é «+00:00» e o fuso horário do Snowflake é «America/Los_Angeles».

Use a seguinte sintaxe para alterar o fuso horário padrão do banco de dados:

ALTER account SET timezone = timezone_string;
Copy

Problemas conhecidos

1. Default database timezone

As operações com esse tipo de dados serão afetadas pelo fuso horário do banco de dados e os resultados podem ser diferentes. Você pode verificar o fuso horário padrão usando as seguintes consultas:

Oracle
SELECT dbtimezone FROM dual;
Copy
Snowflake
SELECT dbtimezone FROM dual;
Copy
2. Oracle Timestamp with local timezone behavior

Ao operar carimbos de data/hora com tipos de dados de fuso horário local, o Oracle converte os carimbos de data/hora para o fuso horário padrão do banco de dados. Para emular esse comportamento no Snowflake, o parâmetro de sessão TIMESTAMP_TYPE_MAPPING deve ser definido como “TIMESTAMP_LTZ”.

ALTER SESSION SET TIMESTAMP_TYPE_MAPPING = 'TIMESTAMP_LTZ';
Copy
3. Timestamp formats may be different

O SnowConvert não realiza nenhuma conversão para as cadeias de formato de data/carimbo de data/hora, portanto, pode haver erros ao implantar o código. Exemplo:

Oracle
INSERT INTO timestamp_with_local_time_zone_table (timestamp_col1) VALUES (TIMESTAMP '2010-10-10 12:00:00 -8:00');
Copy
Snowflake
INSERT INTO timestamp_with_local_time_zone_table(timestamp_col1) VALUES (TIMESTAMP '2010-10-10 12:00:00 -8:00');
Copy

Aviso

A consulta falhará no Snowflake porque o formato de entrada de carimbo de data/hora padrão não reconhece “-8:00” como um deslocamento UTC válido. Ele deve ser substituído por «0800» ou «-08:00» para obter o mesmo resultado.

EWIs relacionados

Sem EWIs relacionados.

Tipo de dados TIMESTAMPWITHTIMEZONE

Descrição

TIMESTAMP WITH TIME ZONE é uma variante de TIMESTAMP que inclui um nome de região de fuso horário ou um deslocamento de fuso horário em seu valor. O equivalente no Snowflake é TIMESTAMP_TZ. (Tipo de dados Timestamp com Time Zone da referência de linguagem Oracle SQL)

O equivalente ao Snowflake é TIMESTAMP_TZ.

Para obter mais informações, consulte também a seção TIMESTAMP.

TIMESTAMP [(fractional_seconds_precision)] WITH TIME ZONE

Copy

Amostra de padrões da origem

Timestamp with Time Zone em Create Table

Oracle
CREATE TABLE timestamp_with_time_zone_table
(
	timestamp_col1 TIMESTAMP(5) WITH TIME ZONE
);


INSERT INTO timestamp_with_time_zone_table(timestamp_col1) VALUES (TIMESTAMP '2010-10-10 12:00:00');
Copy
Snowflake
CREATE OR REPLACE TABLE timestamp_with_time_zone_table
	(
		timestamp_col1 TIMESTAMP_TZ(5)
	)
	COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
	;

	INSERT INTO timestamp_with_time_zone_table(timestamp_col1) VALUES (TIMESTAMP '2010-10-10 12:00:00');
Copy

Recuperação de dados de uma coluna Timestamp with Time Zone

Oracle
SELECT * FROM timestamp_with_time_zone_table;
Copy
Resultado

TIMESTAMP_COL1

2010-10-10 12:00:00.000 -0600

Snowflake
SELECT * FROM
timestamp_with_time_zone_table;
Copy
Resultado

TIMESTAMP_COL1

2010-10-10 12:00:00.000 -0700

Nota

Observe que o fuso horário é diferente nos dois mecanismos porque, quando o fuso horário não é especificado, o fuso horário padrão do banco de dados é adicionado.

Use a seguinte sintaxe para alterar o fuso horário padrão do banco de dados:

ALTER account SET sqtimezone = timezone_string;
Copy

Problemas conhecidos

1. Timestamp formats may be different

O SnowConvert não realiza nenhuma conversão para as cadeias de formato de data/carimbo de data/hora, portanto, pode haver erros ao implantar o código. Exemplo:

Oracle
INSERT INTO timestamp_with_time_zone_table(timestamp_col1) VALUES (TIMESTAMP '2010-10-10 12:00:00 -8:00');
Copy
Snowflake
INSERT INTO timestamp_with_time_zone_table(timestamp_col1) VALUES (TIMESTAMP '2010-10-10 12:00:00 -8:00');
Copy

Aviso

A consulta falhará no Snowflake porque o formato de entrada de carimbo de data/hora padrão não reconhece “-8:00” como um deslocamento UTC válido. Ele deve ser substituído por «-0800» ou «-08:00» para obter o mesmo resultado.

EWIs relacionados

Sem EWIs relacionados.

Aritmética de datetime

Este conteúdo explica a transformação atual de algumas operações aritméticas entre tipos datetime.

Descrição

No Oracle, algumas operações aritméticas podiam ser realizadas entre tipos DateTime, como adição, subtração, multiplicação e divisão. Atualmente, o SnowConvert AI pode resolver alguns casos de adição e subtração. Estes casos são explicados abaixo.

Amostra de padrões da origem

Este é um resumo da transformação atual para as diferentes combinações das operações de adição e subtração com data, carimbos de data/hora, número e tipos desconhecidos.

Nota

Consulte a próxima tabela para os exemplos abaixo.

Oracle

CREATE OR REPLACE TABLE TIMES (
AsTimeStamp TIMESTAMP(6),
AsTimestampTwo TIMESTAMP(6),
AsDate TIMESTAMP,
AsDateTwo TIMESTAMP
);

INSERT INTO TIMES
VALUES (
TO_TIMESTAMP('05/11/21, 11:00 A.M.', 'dd/mm/yy, hh:mi A.M.'),
TO_TIMESTAMP('05/11/21, 10:00 A.M.', 'dd/mm/yy, hh:mi A.M.'),
TO_DATE('06/11/21', 'dd/mm/yy'),
TO_DATE('05/11/21', 'dd/mm/yy'));
Copy
Snowflake
CREATE OR REPLACE TABLE TIMES (
 AsTimeStamp TIMESTAMP(6),
 AsTimestampTwo TIMESTAMP(6),
 AsDate TIMESTAMP(6),
 AsDateTwo TIMESTAMP(6)
 )
 COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
 ;

 INSERT INTO TIMES
 VALUES (
TO_TIMESTAMP('05/11/21, 11:00 A.M.', 'dd/mm/yy, hh:mi A.M.'),
TO_TIMESTAMP('05/11/21, 10:00 A.M.', 'dd/mm/yy, hh:mi A.M.'),
TO_DATE('06/11/21', 'dd/mm/yy'),
TO_DATE('05/11/21', 'dd/mm/yy'));
Copy

Adição

Matriz de combinação

Este é um resumo de como o migrador resolve as operações de adição para as diferentes combinações com data, carimbos de data/hora, número e tipos desconhecidos.

Adição

Data

Carimbo de data/hora

Número

Intervalo

Desconhecido

Float

Data

INVALID

INVALID

Data + dia de intervalo

Data + intervalo IntervalUnit

DATEADD_UDF

DATEADD_UDF

Carimbo de data/hora

INVALID

INVALID

Carimbo de data/hora + dia de intervalo

Carimbo de data/hora + intervalo IntervalUnit

DATEADD_UDF

DATEADD_UDF

Número

Data + dia de intervalo

Carimbo de data/hora + dia de intervalo

Número + Número

INVALID

SSC-EWI-OR0036

Número + float

Intervalo

Data + intervalo IntervalUnit

Carimbo de data/hora + intervalo IntervalUnit

INVALID

SSC-EWI-OR0036

Desconhecido + intervalo IntervalUnit

INVALID

Desconhecido

DATEADD_UDF

DATEADD_UDF

Desconhecido + número

Desconhecido + intervalo IntervalUnit

SSC-EWI-OR0036

SSC-EWI-OR0036

Float

DATEADD_UDF

DATEADD_UDF

Float + número

INVALID

SSC-EWI-OR0036

Float + float

Nota

Uma coluna de tipo desconhecido é gerada porque o migrador não consegue estabelecer o tipo de dados que a coluna contém. Isso pode acontecer por muitos motivos, por exemplo, a falta de DDLs para as tabelas que estão sendo operadas, colunas resultantes das operações nas exibições, CTES ou subconsultas, etc.

Aviso

Por padrão, o Snow Convert migra operações do tipo Date/Timestamp + Interval para as operações nativas do Snowflake, mas, em alguns casos, pode ser útil usar UDF em vez disso. Mais detalhes sobre esta UDF podem ser encontradas aqui.

Os diferentes caminhos que o migrador pode usar para resolver as operações de adição serão explicados abaixo:

Inválido

Certas combinações não são válidas para realizar operações de adição no Oracle:

Oracle
SELECT AsDate + AsDateTwo From TIMES;

SELECT AsDate + AsTimeStamp From TIMES;
Copy
Resultado
SQL Error [975] [42000]: ORA-00975: date + date not allowed

SQL Error [30087] [99999]: ORA-30087: Adding two datetime values is not allowed

Copy

Data + dia de intervalo

Esta é a transformação atual para a operação de adição entre um tipo de data e um número (e vice-versa). Por exemplo

Oracle
SELECT AsDate + 1 FROM TIMES;

SELECT 1 + AsDate FROM TIMES;
Copy
Resultado

ASDATE+1

2021-11-07 00:00:00.000

1+ASDATE

2021-11-07 00:00:00.000

Snowflake
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '+' MAY NOT BEHAVE CORRECTLY BETWEEN unknown AND Number ***/!!!
 AsDate + 1 FROM
 TIMES;


SELECT
 !!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '+' MAY NOT BEHAVE CORRECTLY BETWEEN Number AND unknown ***/!!! 1 + AsDate FROM
 TIMES;
Copy
Resultado

ASDATE + INTERVAL “1 DAY”

2021-11-07

Carimbo de data/hora + dia de intervalo

Esta é a transformação atual para a operação de adição entre um tipo de carimbo de data/hora e um número (e vice-versa). Por exemplo

Oracle
SELECT AsTimestamp + 1 FROM TIMES;

SELECT 1 + AsTimestamp FROM TIMES;
Copy
Resultado

ASTIMESTAMP+1

2021-11-06 11:00:00.000

1+ASTIMESTAMP

2021-11-06 11:00:00.000

Nota

Nota: No Oracle, as colunas DATE e TIMESTAMP contêm um componente de hora, mas o Oracle usou a máscara de formato especificada pelo parâmetro NLS_DATE_FORMAT para decidir como converter implicitamente a data em uma cadeia de caracteres; é por isso que, ao realizar algumas operações, entre TIMESTAMP e intervalos, o resultado poderia ser mostrado como DATE, ocultando o componente de hora, a menos que o parâmetro NLS_DATE_FORMAT seja alterado.

Snowflake
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '+' MAY NOT BEHAVE CORRECTLY BETWEEN unknown AND Number ***/!!!
 AsTimestamp + 1 FROM
 TIMES;


SELECT
 !!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '+' MAY NOT BEHAVE CORRECTLY BETWEEN Number AND unknown ***/!!! 1 + AsTimestamp FROM
 TIMES;
Copy
Resultado

ASTIMESTAMP + INTERVAL “1 DAY”

2021-11-06 11:00:00.000

DATEADD_UDF

Para os casos em que há uma operação de adição entre um tipo de data ou carimbo de data/hora e um tipo desconhecido, uma função definida pelo usuário (UDF) é adicionada. A implementação atual da UDF pode ser encontrada aqui. A UDF está localizada na pasta UDFs. Por exemplo:

Nota

Para os exemplos a seguir, será usada uma subconsulta, tentando simular a coluna de tipo desconhecido

Oracle
SELECT AsDate + (SELECT EXTRACT(DAY FROM AsTimestampTwo) FROM TIMES) FROM TIMES;

SELECT AsTimestamp + (SELECT EXTRACT(DAY FROM AsTimestampTwo) FROM TIMES) FROM TIMES;
Copy
Resultado

ASDATE+(SELECTEXTRACT(DAYFROMASTIMESTAMPTWO)FROMTIMES)

2021-11-11 00:00:00.000

ASTIMESTAMP+(SELECTEXTRACT(DAYFROMASTIMESTAMPTWO)FROMTIMES)

2021-11-10 11:00:00.000

Snowflake
SELECT AsDate + (SELECT EXTRACT(DAY FROM AsTimestampTwo) FROM
TIMES
) FROM
TIMES;

SELECT AsTimestamp + (SELECT EXTRACT(DAY FROM AsTimestampTwo) FROM
TIMES
) FROM
TIMES;
Copy
Resultado

PUBLIC.DATEADD_UDF( ASDATE, (SELECT EXTRACT(DAY FROM ASTIMESTAMPTWO) FROM PUBLIC.TIMES))

2021-11-11

PUBLIC.DATEADD_UDF( ASTIMESTAMP, (SELECT EXTRACT(DAY FROM ASTIMESTAMPTWO) FROM PUBLIC.TIMES))

2021-11-10 11:00:00.000

Subtração

Matriz de combinação

Subtração

Data

Carimbo de data/hora

Número

Intervalo

Desconhecido

Float

Data

DATEDIFF

TIMESTAMP_DIFF___UDF

Data - dia de intervalo

Data - intervalo IntervalUnit

DATEDIFF_UDF

DATEDIFF_UDF

Carimbo de data/hora

TIMESTAMP_DIFF___UDF

TIMESTAMP_DIFF___UDF

Carimbo de data/hora - dia de intervalo

Carimbo de data/hora - intervalo IntervalUnit

DATEDIFF_UDF

DATEDIFF_UDF

Número

INVALID

INVALID

Número - número

INVALID

SSC-EWI-OR0036

Número - flutuante

Intervalo

INVALID

INVALID

INVALID

SSC-EWI-OR0036

Desconhecido - intervalo IntervalUnit

NOT SUPPORTED IN ORACLE

Desconhecido

DATEDIFF_UDF

DATEDIFF_UDF

SSC-EWI-OR0036

Desconhecido - intervalo IntervalUnit

SSC-EWI-OR0036

SSC-EWI-OR0036

Float

DATEDIFF_UDF

DATEDIFF_UDF

Float - número

NOT SUPPORTED IN ORACLE

SSC-EWI-OR0036

Float - float

Nota

Uma coluna de tipo desconhecido é gerada porque o migrador não consegue estabelecer o tipo de dados que a coluna contém. Isso pode acontecer por muitos motivos, por exemplo, a falta de DDLs para as tabelas que estão sendo operadas, colunas resultantes das operações nas exibições, CTES ou subconsultas, etc.

Aviso

Por padrão, o Snow Convert migra operações do tipo Date/Timestamp + Interval para as operações nativas do Snowflake, mas, em alguns casos, pode ser útil usar UDF em vez disso. Mais detalhes sobre esta UDF podem ser encontradas aqui.

Os diferentes caminhos que o migrador pode usar para resolver as operações de subtração serão explicados abaixo:

Inválido

Certas combinações não são válidas para realizar operações de subtração no Oracle:

Oracle
SELECT 1 - AsDate FROM TIMES;

SELECT 1 - AsTimestamp FROM TIMES;
Copy
Resultado
SQL Error [932] [42000]: ORA-00932: inconsistent datatypes: expected NUMBER got DATE

SQL Error [932] [42000]: ORA-00932: inconsistent datatypes: expected NUMBER got TIMESTAMP

Copy

DATEDIFF

A subtração entre dois operandos do tipo date é convertida na função DATEDIFF do Snowflake, usando “day” como unidade de tempo (primeiro parâmetro). Por exemplo

Oracle
SELECT AsDate - AsDateTwo FROM TIMES;
Copy
Resultado

ASDATE-ASDATETWO

1

Snowflake
SELECT AsDate - AsDateTwo FROM
TIMES;
Copy
Resultado

DATEDIFF(DAY, ASDATETWO, ASDATE)

1

Data - dia de intervalo

Esta é a transformação atual para a operação de subtração entre um tipo de data e um número. Por exemplo

Oracle
SELECT AsDate - 1 FROM TIMES;

SELECT AsDate + -1 FROM TIMES;
Copy
Resultado

ASDATE-1

2021-11-05 00:00:00.000

ASDATE+-1

2021-11-05 00:00:00.000

Snowflake
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '-' MAY NOT BEHAVE CORRECTLY BETWEEN unknown AND Number ***/!!!
 AsDate - 1 FROM
 TIMES;

SELECT
 !!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '+' MAY NOT BEHAVE CORRECTLY BETWEEN unknown AND Number ***/!!! AsDate + -1 FROM
 TIMES;
Copy
Resultado

ASDATE - INTERVAL “1 DAY”

2021-11-05

ASDATE + INTERVAL “-1 DAY”

2021-11-05

Carimbo de data/hora - dia de intervalo

Esta é a transformação atual da operação de adição entre um tipo de carimbo de data/hora e um número. Por exemplo

Oracle
SELECT AsTimestamp - 1 FROM TIMES;

SELECT AsTimestamp + -1 FROM TIMES;
Copy
Resultado

ASTIMESTAMP-1

2021-11-04 11:00:00.000

ASTIMESTAMP+-1

2021-11-04 11:00:00.000

Snowflake
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '-' MAY NOT BEHAVE CORRECTLY BETWEEN unknown AND Number ***/!!!
 AsTimestamp - 1 FROM
 TIMES;

SELECT
 !!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '+' MAY NOT BEHAVE CORRECTLY BETWEEN unknown AND Number ***/!!! AsTimestamp + -1 FROM
 TIMES;
Copy
Resultado

ASTIMESTAMP - INTERVAL “1 DAY”

2021-11-04 11:00:00.000

ASTIMESTAMP + INTERVAL “-1 DAY”

2021-11-04 11:00:00.000

Nota

Nota: No Oracle, as colunas DATE e TIMESTAMP contêm um componente de hora, mas o Oracle usa a máscara de formato especificada pelo parâmetro NLS_DATE_FORMAT para decidir como converter implicitamente a data em uma cadeia de caracteres; é por isso que, ao realizar algumas operações entre TIMESTAMP e intervalos, o resultado poderia ser mostrado como DATE, ocultando o componente de hora, a menos que o parâmetro NLS_DATE_FORMAT seja alterado.

Mais informações sobre o formato NLS_DATE_FORMAT pode ser encontrado aqui.

TIMESTAMP_DIFF_UDF

As subtrações entre tipos timestamp e dates com um timestamp e vice-versa; são resolvidas inserindo a função definida pelo usuário TIMESTAMP_DIFF_UDF, (implementação aqui). Por exemplo

Oracle
SELECT AsTimeStamp - AsTimeStampTwo FROM TIMES;

SELECT AsTimeStamp - AsDateTwo FROM TIMES;

SELECT AsDateTwo - AsTimeStamp FROM TIMES;
Copy
Resultado

ASTIMESTAMP-ASTIMESTAMPTWO

+000000000 01:00:00.000000

ASTIMESTAMP-ASDATETWO

+000000000 11:00:00.000000

ASDATETWO-ASTIMESTAMP

-000000000 11:00:00.000000

Snowflake
SELECT AsTimeStamp - AsTimeStampTwo FROM
TIMES;

SELECT AsTimeStamp - AsDateTwo FROM
TIMES;

SELECT AsDateTwo - AsTimeStamp FROM
TIMES;
Copy
Resultado

PUBLIC.TIMESTAMP_DIFF_UDF( ASTIMESTAMP, ASTIMESTAMPTWO)

+000000000 01:00:00.00000000

PUBLIC.TIMESTAMP_DIFF_UDF( ASTIMESTAMP, ASDATETWO)

+000000000 11:00:00.00000000

PUBLIC.TIMESTAMP_DIFF_UDF( ASDATETWO, ASTIMESTAMP)

-000000000 -11:00:00.00000000

DATEDIFF_UDF

Para os casos em que há uma operação de adição entre um tipo de data ou carimbo de data/hora e um tipo desconhecido, uma função definida pelo usuário (UDF) é adicionada. A implementação da UDF pode ser encontrada aqui, mas pode ser editada para executar o que é necessário. A UDF está localizada na pasta UDFs. Por exemplo:

Oracle
SELECT ASDATE - (EXTRACT(DAY FROM ASDATE)) FROM TIMES;

SELECT ASTIMESTAMP - (EXTRACT(DAY FROM ASDATE)) FROM TIMES;
Copy
Resultado

ASDATE-(EXTRACT(DAYFROMASDATE))

2021-10-31 00:00:00.000

ASTIMESTAMP-(EXTRACT(DAYFROMASDATE))

2021-10-30 11:00:00.000

Snowflake
SELECT ASDATE - (EXTRACT(DAY FROM ASDATE)) FROM
TIMES;


SELECT ASTIMESTAMP - (EXTRACT(DAY FROM ASDATE)) FROM
TIMES;
Copy
Resultado

PUBLIC.DATEDIFF_UDF( ASDATE, (EXTRACT(DAY FROM ASDATE)))

2021-10-31

PUBLIC.DATEDIFF_UDF( ASTIMESTAMP, (EXTRACT(DAY FROM ASDATE)))

2021-10-30 11:00:00.000

Casos comuns

Aviso: SSC-EWI-OR0036

Este aviso é usado para indicar se uma operação de adição ou subtração pode não se comportar corretamente devido aos tipos de dados dos operandos. Isso significa que talvez o resultado da operação no Snowflake não seja funcionalmente equivalente no Oracle. A adição e subtração entre um tipo de data ou numérico e um tipo desconhecido é um dos casos mais comuns. Por exemplo

Oracle
SELECT AsDate - (EXTRACT(DAY FROM ASDATE)) FROM TIMES;
Copy
Snowflake
SELECT AsDate - (EXTRACT(DAY FROM ASDATE)) FROM
TIMES;
Copy

Este EWI é adicionado em operações em que o tipo de uma coluna não pôde ser resolvido; se o tipo de coluna for INTERVAL e é operado somente com outros intervalos, o EWI será adicionado, mas o código não será comentado. O exemplo a seguir descreve esse comportamento:

Oracle
SELECT INTERVAL '1' DAY + interval_column FROM UNKNOWN_TABLE;
Copy
Snowflake
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '+' MAY NOT BEHAVE CORRECTLY BETWEEN Unknown AND Interval ***/!!!
interval_column + INTERVAL '1 day' FROM
UNKNOWN_TABLE;
Copy

Problemas conhecidos

1. TIMESTAMP DIFF UDF improvement

É preciso melhorar TIMESTAMP_DIFF_UDF para poder especificar o tipo de retorno. Significa adicionar um terceiro parâmetro, em que é possível especificar a parte da hora, por exemplo, dia, hora, mês, etc.

2. Built-in functions as operators

Atualmente não há gerenciamento para operações de data entre funções internas que retornam tipos de data.

3. Multiple operands

Atualmente, não há gerenciamento para operação de data com mais de dois operandos. Isso pode funcionar, mas também podem ocorrer problemas.

4. Comparison operators

Atualmente, não há gerenciamento para operações de data com operadores de comparação como maior que, menor que, etc.

5. Output format

O formato do resultado das operações aritméticas poderia ser alterado usando o próximo comando ALTER SESSION SET DATE_OUTPUT_FORMAT = 'DESIRED-FORMAT‘; no Snowflake.

6. Issues in interval operations with seconds precision

Algumas operações podem diferir em precisão, especificamente aquelas que incluem intervalos com precisão de segundos. Isso ocorre porque o Oracle arredonda conforme a precisão. O intervalo do Snowflake não aceita segundos com casas decimais e, para ter o mesmo resultado, é necessário alterar as casas decimais de segundo para milissegundos em intervalos que consideram o arredondamento realizado pelo Oracle. O exemplo a seguir mostra esse problema

Oracle
SELECT AsTimeStamp+INTERVAL '15.6789' SECOND(2,3) FROM times;

SELECT AsTimeStamp+INTERVAL '15.6783' SECOND(2,3) FROM times;
Copy
Resultado

ASTIMESTAMP+INTERVAL’15.6789’SECOND(2,3)

2021-11-05 11:00:15.679

ASTIMESTAMP+INTERVAL’15.6783’SECOND(2,3)

2021-11-05 11:00:15.678

Snowflake
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '+' MAY NOT BEHAVE CORRECTLY BETWEEN Unknown AND Interval ***/!!!
 AsTimeStamp + INTERVAL '15.6789 second'
FROM
 times;

SELECT
 !!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '+' MAY NOT BEHAVE CORRECTLY BETWEEN Unknown AND Interval ***/!!! AsTimeStamp + INTERVAL '15.6783 second'
FROM
 times;
Copy
Resultado

ASTIMESTAMP + INTERVAL “15.6789 SECOND”

2021-11-05 11:00:16.000

ASTIMESTAMP + INTERVAL “15.6783 SECOND”

2021-11-05 11:00:16.000

ASTIMESTAMP + INTERVAL “15 SECOND, 679 MILLISECOND”

2021-11-05 11:00:15.679

ASTIMESTAMP + INTERVAL “15 SECOND, 678 MILLISECOND”

2021-11-05 11:00:15.678

EWIs relacionados

  1. SSC-EWI-0108: a subconsulta a seguir corresponde a pelo menos um dos padrões considerados inválidos e pode produzir erros de compilação.

  2. SSC-EWI-OR0036: problemas de resolução de tipos; a operação aritmética pode não se comportar corretamente entre a cadeia de caracteres e a data.

UDFs Interval vs. operação de intervalo nativo do Snowflake

Descrição

A tabela a seguir mostra uma comparação entre DATEADD_UDF INTERVAL e DATEDIFF_UDF INTERVAL vs a operação nativa do Snowflake para aritmética de intervalo.

Código necessário

Para executar as consultas da tabela comparativa, é necessário executar o seguinte código:

CREATE OR REPLACE TABLE TIMES(
AsTimeStamp TIMESTAMP,
AsTimestampTwo TIMESTAMP,
AsDate DATE,
AsDateTwo DATE
);

INSERT INTO TIMES VALUES (
  TO_TIMESTAMP('05/11/21, 11:00 A.M.', 'dd/mm/yy, hh:mi A.M.'), 
  TO_TIMESTAMP('05/11/21, 10:00 A.M.', 'dd/mm/yy, hh:mi A.M.'), 
  TO_DATE('06/11/21', 'dd/mm/yy'), 
  TO_DATE('05/11/21', 'dd/mm/yy'));

CREATE TABLE UNKNOWN_TABLE(
  Unknown timestamp
);

INSERT INTO UNKNOWN_TABLE VALUES (
  TO_TIMESTAMP('01/10/09, 12:00 P.M.', 'dd/mm/yy, hh:mi P.M.')
);
Copy
CREATE OR REPLACE TABLE TIMES (
  AsTimeStamp TIMESTAMP(6),
  AsTimestampTwo TIMESTAMP(6),
  AsDate TIMESTAMP /*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/,
  AsDateTwo TIMESTAMP /*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/
  )
  COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
  ;

  INSERT INTO TIMES
  VALUES (
  TO_TIMESTAMP('05/11/21, 11:00 A.M.', 'dd/mm/yy, hh:mi A.M.'),
  TO_TIMESTAMP('05/11/21, 10:00 A.M.', 'dd/mm/yy, hh:mi A.M.'),
  TO_DATE('06/11/21', 'dd/mm/yy'),
  TO_DATE('05/11/21', 'dd/mm/yy'));

  CREATE OR REPLACE TABLE UNKNOWN_TABLE (
  Unknown TIMESTAMP(6)
  )
  COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
  ;

  INSERT INTO UNKNOWN_TABLE
  VALUES (
  TO_TIMESTAMP('01/10/09, 12:00 P.M.', 'dd/mm/yy, hh:mi P.M.')
);
Copy

Tabela de comparação

Oracle

SELECT AsTimeStamp+INTERVAL '1-1' YEAR(2) TO MONTH FROM TIMES;
SELECT AsTimeStamp-INTERVAL '1-1' YEAR(2) TO MONTH FROM TIMES;
SELECT AsTimeStamp+INTERVAL '2-1' YEAR(4) TO MONTH FROM TIMES;
SELECT AsTimeStamp-INTERVAL '2-1' YEAR(4) TO MONTH FROM TIMES;
SELECT AsTimeStamp+INTERVAL '1' MONTH FROM TIMES;
SELECT AsTimeStamp-INTERVAL '1' MONTH FROM TIMES;
SELECT AsTimeStamp+INTERVAL '2' MONTH FROM TIMES;
SELECT AsTimeStamp-INTERVAL '2' MONTH FROM TIMES;
SELECT AsTimeStamp+INTERVAL '1 01:00:00.222' DAY TO SECOND(3) FROM TIMES;
SELECT AsTimeStamp-INTERVAL '1 01:00:00.222' DAY TO SECOND(3) FROM TIMES;
SELECT AsTimeStamp+INTERVAL '1 01:10' DAY TO MINUTE FROM TIMES;
SELECT AsTimeStamp-INTERVAL '1 01:10' DAY TO MINUTE FROM TIMES;
SELECT AsTimeStamp+INTERVAL '1 1' DAY TO HOUR FROM TIMES;
SELECT AsTimeStamp-INTERVAL '1 1' DAY TO HOUR FROM TIMES;
SELECT AsTimeStamp+INTERVAL '10' DAY FROM TIMES;
SELECT AsTimeStamp-INTERVAL '10' DAY FROM TIMES;
SELECT AsTimeStamp+INTERVAL '3:05' HOUR TO MINUTE FROM TIMES;
SELECT AsTimeStamp-INTERVAL '3:05' HOUR TO MINUTE FROM TIMES;
SELECT AsTimeStamp+INTERVAL '5' HOUR FROM TIMES;
SELECT AsTimeStamp-INTERVAL '5' HOUR FROM TIMES;
SELECT AsTimeStamp+INTERVAL '5:10' MINUTE TO SECOND FROM TIMES;
SELECT AsTimeStamp-INTERVAL '5:10' MINUTE TO SECOND FROM TIMES;
SELECT AsTimeStamp+INTERVAL '30' MINUTE FROM TIMES;
SELECT AsTimeStamp-INTERVAL '30' MINUTE FROM TIMES;
SELECT AsTimeStamp+INTERVAL '333' HOUR(3) FROM TIMES;
SELECT AsTimeStamp-INTERVAL '333' HOUR(3) FROM TIMES;
SELECT AsTimeStamp+INTERVAL '15.6789' SECOND(2,3) FROM TIMES;
SELECT AsTimeStamp-INTERVAL '15.6789' SECOND(2,3) FROM TIMES;
SELECT AsDate+INTERVAL '1-1' YEAR(2) TO MONTH FROM TIMES;
SELECT AsDate-INTERVAL '1-1' YEAR(2) TO MONTH FROM TIMES;
SELECT AsDate+INTERVAL '2-1' YEAR(4) TO MONTH FROM TIMES;
SELECT AsDate-INTERVAL '2-1' YEAR(4) TO MONTH FROM TIMES;
SELECT AsDate+INTERVAL '1' MONTH FROM TIMES;
SELECT AsDate-INTERVAL '1' MONTH FROM TIMES;
SELECT AsDate+INTERVAL '2' MONTH FROM TIMES;
SELECT AsDate-INTERVAL '2' MONTH FROM TIMES;
SELECT AsDate+INTERVAL '1 01:00:00.222' DAY TO SECOND(3) FROM TIMES;
SELECT AsDate-INTERVAL '1 01:00:00.222' DAY TO SECOND(3) FROM TIMES;
SELECT AsDate+INTERVAL '1 01:10' DAY TO MINUTE FROM TIMES;
SELECT AsDate-INTERVAL '1 01:10' DAY TO MINUTE FROM TIMES;
SELECT AsDate+INTERVAL '1 1' DAY TO HOUR FROM TIMES;
SELECT AsDate-INTERVAL '1 1' DAY TO HOUR FROM TIMES;
SELECT AsDate+INTERVAL '10' DAY FROM TIMES;
SELECT AsDate-INTERVAL '10' DAY FROM TIMES;
SELECT AsDate+INTERVAL '3:05' HOUR TO MINUTE FROM TIMES;
SELECT AsDate-INTERVAL '3:05' HOUR TO MINUTE FROM TIMES;
SELECT AsDate+INTERVAL '5' HOUR FROM TIMES;
SELECT AsDate-INTERVAL '5' HOUR FROM TIMES;
SELECT AsDate+INTERVAL '5:10' MINUTE TO SECOND FROM TIMES;
SELECT AsDate-INTERVAL '5:10' MINUTE TO SECOND FROM TIMES;
SELECT AsDate+INTERVAL '30' MINUTE FROM TIMES;
SELECT AsDate-INTERVAL '30' MINUTE FROM TIMES;
SELECT AsDate+INTERVAL '333' HOUR(3) FROM TIMES;
SELECT AsDate-INTERVAL '333' HOUR(3) FROM TIMES;
SELECT AsDate+INTERVAL '15.6789' SECOND(2,3) FROM TIMES;
SELECT AsDate-INTERVAL '15.6789' SECOND(2,3) FROM TIMES;
SELECT Unknown+INTERVAL '1-1' YEAR(2) TO MONTH FROM UNKNOWN_TABLE;
SELECT Unknown-INTERVAL '1-1' YEAR(2) TO MONTH FROM UNKNOWN_TABLE;
SELECT Unknown+INTERVAL '2-1' YEAR(4) TO MONTH FROM UNKNOWN_TABLE;
SELECT Unknown-INTERVAL '2-1' YEAR(4) TO MONTH FROM UNKNOWN_TABLE;
SELECT Unknown+INTERVAL '1' MONTH FROM UNKNOWN_TABLE;
SELECT Unknown-INTERVAL '1' MONTH FROM UNKNOWN_TABLE;
SELECT Unknown+INTERVAL '2' MONTH FROM UNKNOWN_TABLE;
SELECT Unknown-INTERVAL '2' MONTH FROM UNKNOWN_TABLE;
SELECT Unknown+INTERVAL '1 01:00:00.222' DAY TO SECOND(3) FROM UNKNOWN_TABLE;
SELECT Unknown-INTERVAL '1 01:00:00.222' DAY TO SECOND(3) FROM UNKNOWN_TABLE;
SELECT Unknown+INTERVAL '1 01:10' DAY TO MINUTE FROM UNKNOWN_TABLE;
SELECT Unknown-INTERVAL '1 01:10' DAY TO MINUTE FROM UNKNOWN_TABLE;
SELECT Unknown+INTERVAL '1 1' DAY TO HOUR FROM UNKNOWN_TABLE;
SELECT Unknown-INTERVAL '1 1' DAY TO HOUR FROM UNKNOWN_TABLE;
SELECT Unknown+INTERVAL '10' DAY FROM UNKNOWN_TABLE;
SELECT Unknown-INTERVAL '10' DAY FROM UNKNOWN_TABLE;
SELECT Unknown+INTERVAL '3:05' HOUR TO MINUTE FROM UNKNOWN_TABLE;
SELECT Unknown-INTERVAL '3:05' HOUR TO MINUTE FROM UNKNOWN_TABLE;
SELECT Unknown+INTERVAL '5' HOUR FROM UNKNOWN_TABLE;
SELECT Unknown-INTERVAL '5' HOUR FROM UNKNOWN_TABLE;
SELECT Unknown+INTERVAL '5:10' MINUTE TO SECOND FROM UNKNOWN_TABLE;
SELECT Unknown-INTERVAL '5:10' MINUTE TO SECOND FROM UNKNOWN_TABLE;
SELECT Unknown+INTERVAL '30' MINUTE FROM UNKNOWN_TABLE;
SELECT Unknown-INTERVAL '30' MINUTE FROM UNKNOWN_TABLE;
SELECT Unknown+INTERVAL '333' HOUR(3) FROM UNKNOWN_TABLE;
SELECT Unknown-INTERVAL '333' HOUR(3) FROM UNKNOWN_TABLE;
SELECT Unknown+INTERVAL '15.6789' SECOND(2,3) FROM UNKNOWN_TABLE;
SELECT Unknown-INTERVAL '15.6789' SECOND(2,3) FROM UNKNOWN_TABLE;
SELECT INTERVAL '1-1' YEAR(2) TO MONTH+ AsTimeStamp FROM TIMES;
SELECT INTERVAL '1-1' YEAR(2) TO MONTH+AsDate FROM TIMES;
SELECT INTERVAL '1-1' YEAR(2) TO MONTH+Unknown FROM UNKNOWN_TABLE;
SELECT INTERVAL '2-1' YEAR(4) TO MONTH+AsTimeStamp FROM TIMES;
SELECT INTERVAL '2-1' YEAR(4) TO MONTH+AsDate FROM TIMES;
SELECT INTERVAL '2-1' YEAR(4) TO MONTH+Unknown FROM UNKNOWN_TABLE;
SELECT INTERVAL '1' MONTH+AsTimeStamp FROM TIMES;
SELECT INTERVAL '1' MONTH+AsDate FROM TIMES;
SELECT INTERVAL '1' MONTH+Unknown FROM UNKNOWN_TABLE;
SELECT INTERVAL '2' MONTH+AsTimeStamp FROM TIMES;
SELECT INTERVAL '2' MONTH+AsDate FROM TIMES;
SELECT INTERVAL '2' MONTH+Unknown FROM UNKNOWN_TABLE;
SELECT INTERVAL '1 01:00:00.222' DAY TO SECOND(3)+AsTimeStamp FROM TIMES;
SELECT INTERVAL '1 01:00:00.222' DAY TO SECOND(3)+AsDate FROM TIMES;
SELECT INTERVAL '1 01:00:00.222' DAY TO SECOND(3)+Unknown FROM UNKNOWN_TABLE;
SELECT INTERVAL '1 01:10' DAY TO MINUTE+AsTimeStamp FROM TIMES;
SELECT INTERVAL '1 01:10' DAY TO MINUTE+AsDate FROM TIMES;
SELECT INTERVAL '1 01:10' DAY TO MINUTE+Unknown FROM UNKNOWN_TABLE;
SELECT INTERVAL '1 1' DAY TO HOUR+AsTimeStamp FROM TIMES;
SELECT INTERVAL '1 1' DAY TO HOUR+AsDate FROM TIMES;
SELECT INTERVAL '1 1' DAY TO HOUR+Unknown FROM UNKNOWN_TABLE;
SELECT INTERVAL '10' DAY+AsTimeStamp FROM TIMES;
SELECT INTERVAL '10' DAY+AsDate FROM TIMES;
SELECT INTERVAL '10' DAY+Unknown FROM UNKNOWN_TABLE;
SELECT INTERVAL '3:05' HOUR TO MINUTE+AsTimeStamp FROM TIMES;
SELECT INTERVAL '3:05' HOUR TO MINUTE+AsDate FROM TIMES;
SELECT INTERVAL '3:05' HOUR TO MINUTE+Unknown FROM UNKNOWN_TABLE;
SELECT INTERVAL '5' HOUR+AsTimeStamp FROM TIMES;
SELECT INTERVAL '5' HOUR+AsDate FROM TIMES;
SELECT INTERVAL '5' HOUR+Unknown FROM UNKNOWN_TABLE;
SELECT INTERVAL '5:10' MINUTE TO SECOND+AsTimeStamp FROM TIMES;
SELECT INTERVAL '5:10' MINUTE TO SECOND+AsDate FROM TIMES;
SELECT INTERVAL '5:10' MINUTE TO SECOND+Unknown FROM UNKNOWN_TABLE;
SELECT INTERVAL '30' MINUTE+AsTimeStamp FROM TIMES;
SELECT INTERVAL '30' MINUTE+AsDate FROM TIMES;
SELECT INTERVAL '30' MINUTE+Unknown FROM UNKNOWN_TABLE;
SELECT INTERVAL '333' HOUR(3)+AsTimeStamp FROM TIMES;
SELECT INTERVAL '333' HOUR(3)+AsDate FROM TIMES;
SELECT INTERVAL '333' HOUR(3)+Unknown FROM UNKNOWN_TABLE;
SELECT INTERVAL '15.6789' SECOND(2,3)+AsTimeStamp FROM TIMES;
SELECT INTERVAL '15.6789' SECOND(2,3)+AsDate FROM TIMES;
SELECT INTERVAL '15.6789' SECOND(2,3)+Unknown FROM UNKNOWN_TABLE;
Copy

Snowflake

SELECT AsTimeStamp + INTERVAL '1y, 1mm' FROM PUBLIC.TIMES;
SELECT AsTimeStamp - INTERVAL '1y, 1mm' FROM PUBLIC.TIMES;
SELECT AsTimeStamp + INTERVAL '2y, 1mm' FROM PUBLIC.TIMES;
SELECT AsTimeStamp - INTERVAL '2y, 1mm' FROM PUBLIC.TIMES;
SELECT AsTimeStamp + INTERVAL '1 month' FROM PUBLIC.TIMES;
SELECT AsTimeStamp - INTERVAL '1 month' FROM PUBLIC.TIMES;
SELECT AsTimeStamp + INTERVAL '2 month' FROM PUBLIC.TIMES;
SELECT AsTimeStamp - INTERVAL '2 month' FROM PUBLIC.TIMES;
SELECT AsTimeStamp + INTERVAL '1d, 01h, 00m, 00s, 222ms' FROM PUBLIC.TIMES;
SELECT AsTimeStamp - INTERVAL '1d, 01h, 00m, 00s, 222ms' FROM PUBLIC.TIMES;
SELECT AsTimeStamp + INTERVAL '1d, 01h, 10m' FROM PUBLIC.TIMES;
SELECT AsTimeStamp - INTERVAL '1d, 01h, 10m' FROM PUBLIC.TIMES;
SELECT AsTimeStamp + INTERVAL '1d, 1h' FROM PUBLIC.TIMES;
SELECT AsTimeStamp - INTERVAL '1d, 1h' FROM PUBLIC.TIMES;
SELECT AsTimeStamp + INTERVAL '10 day' FROM PUBLIC.TIMES;
SELECT AsTimeStamp - INTERVAL '10 day' FROM PUBLIC.TIMES;
SELECT AsTimeStamp + INTERVAL '3h, 05m' FROM PUBLIC.TIMES;
SELECT AsTimeStamp - INTERVAL '3h, 05m' FROM PUBLIC.TIMES;
SELECT AsTimeStamp + INTERVAL '5 hour' FROM PUBLIC.TIMES;
SELECT AsTimeStamp - INTERVAL '5 hour' FROM PUBLIC.TIMES;
SELECT AsTimeStamp + INTERVAL '5m, 10s' FROM PUBLIC.TIMES;
SELECT AsTimeStamp - INTERVAL '5m, 10s' FROM PUBLIC.TIMES;
SELECT AsTimeStamp + INTERVAL '30 minute' FROM PUBLIC.TIMES;
SELECT AsTimeStamp - INTERVAL '30 minute' FROM PUBLIC.TIMES;
SELECT AsTimeStamp + INTERVAL '333 hour' FROM PUBLIC.TIMES;
SELECT AsTimeStamp - INTERVAL '333 hour' FROM PUBLIC.TIMES;
SELECT AsTimeStamp + INTERVAL '15.6789 second' FROM PUBLIC.TIMES;
SELECT AsTimeStamp - INTERVAL '15.6789 second' FROM PUBLIC.TIMES;
SELECT AsDate + INTERVAL '1y, 1mm' FROM PUBLIC.TIMES;
SELECT AsDate - INTERVAL '1y, 1mm' FROM PUBLIC.TIMES;
SELECT AsDate + INTERVAL '2y, 1mm' FROM PUBLIC.TIMES;
SELECT AsDate - INTERVAL '2y, 1mm' FROM PUBLIC.TIMES;
SELECT AsDate + INTERVAL '1 month' FROM PUBLIC.TIMES;
SELECT AsDate - INTERVAL '1 month' FROM PUBLIC.TIMES;
SELECT AsDate + INTERVAL '2 month' FROM PUBLIC.TIMES;
SELECT AsDate - INTERVAL '2 month' FROM PUBLIC.TIMES;
SELECT AsDate + INTERVAL '1d, 01h, 00m, 00s, 222ms' FROM PUBLIC.TIMES;
SELECT AsDate - INTERVAL '1d, 01h, 00m, 00s, 222ms' FROM PUBLIC.TIMES;
SELECT AsDate + INTERVAL '1d, 01h, 10m' FROM PUBLIC.TIMES;
SELECT AsDate - INTERVAL '1d, 01h, 10m' FROM PUBLIC.TIMES;
SELECT AsDate + INTERVAL '1d, 1h' FROM PUBLIC.TIMES;
SELECT AsDate - INTERVAL '1d, 1h' FROM PUBLIC.TIMES;
SELECT AsDate + INTERVAL '10 day' FROM PUBLIC.TIMES;
SELECT AsDate - INTERVAL '10 day' FROM PUBLIC.TIMES;
SELECT AsDate + INTERVAL '3h, 05m' FROM PUBLIC.TIMES;
SELECT AsDate - INTERVAL '3h, 05m' FROM PUBLIC.TIMES;
SELECT AsDate + INTERVAL '5 hour' FROM PUBLIC.TIMES;
SELECT AsDate - INTERVAL '5 hour' FROM PUBLIC.TIMES;
SELECT AsDate + INTERVAL '5m, 10s' FROM PUBLIC.TIMES;
SELECT AsDate - INTERVAL '5m, 10s' FROM PUBLIC.TIMES;
SELECT AsDate + INTERVAL '30 minute' FROM PUBLIC.TIMES;
SELECT AsDate - INTERVAL '30 minute' FROM PUBLIC.TIMES;
SELECT AsDate + INTERVAL '333 hour' FROM PUBLIC.TIMES;
SELECT AsDate - INTERVAL '333 hour' FROM PUBLIC.TIMES;
SELECT AsDate + INTERVAL '15.6789 second' FROM PUBLIC.TIMES;
SELECT AsDate - INTERVAL '15.6789 second' FROM PUBLIC.TIMES;
SELECT Unknown + INTERVAL '1y, 1mm' FROM PUBLIC.UNKNOWN_TABLE;
SELECT Unknown - INTERVAL '1y, 1mm' FROM PUBLIC.UNKNOWN_TABLE;
SELECT Unknown + INTERVAL '2y, 1mm' FROM PUBLIC.UNKNOWN_TABLE;
SELECT Unknown - INTERVAL '2y, 1mm' FROM PUBLIC.UNKNOWN_TABLE;
SELECT Unknown + INTERVAL '1 month' FROM PUBLIC.UNKNOWN_TABLE;
SELECT Unknown - INTERVAL '1 month' FROM PUBLIC.UNKNOWN_TABLE;
SELECT Unknown + INTERVAL '2 month' FROM PUBLIC.UNKNOWN_TABLE;
SELECT Unknown - INTERVAL '2 month' FROM PUBLIC.UNKNOWN_TABLE;
SELECT Unknown + INTERVAL '1d, 01h, 00m, 00s, 222ms' FROM PUBLIC.UNKNOWN_TABLE;
SELECT Unknown - INTERVAL '1d, 01h, 00m, 00s, 222ms' FROM PUBLIC.UNKNOWN_TABLE;
SELECT Unknown + INTERVAL '1d, 01h, 10m' FROM PUBLIC.UNKNOWN_TABLE;
SELECT Unknown - INTERVAL '1d, 01h, 10m' FROM PUBLIC.UNKNOWN_TABLE;
SELECT Unknown + INTERVAL '1d, 1h' FROM PUBLIC.UNKNOWN_TABLE;
SELECT Unknown - INTERVAL '1d, 1h' FROM PUBLIC.UNKNOWN_TABLE;
SELECT Unknown + INTERVAL '10 day' FROM PUBLIC.UNKNOWN_TABLE;
SELECT Unknown - INTERVAL '10 day' FROM PUBLIC.UNKNOWN_TABLE;
SELECT Unknown + INTERVAL '3h, 05m' FROM PUBLIC.UNKNOWN_TABLE;
SELECT Unknown - INTERVAL '3h, 05m' FROM PUBLIC.UNKNOWN_TABLE;
SELECT Unknown + INTERVAL '5 hour' FROM PUBLIC.UNKNOWN_TABLE;
SELECT Unknown - INTERVAL '5 hour' FROM PUBLIC.UNKNOWN_TABLE;
SELECT Unknown + INTERVAL '5m, 10s' FROM PUBLIC.UNKNOWN_TABLE;
SELECT Unknown - INTERVAL '5m, 10s' FROM PUBLIC.UNKNOWN_TABLE;
SELECT Unknown + INTERVAL '30 minute' FROM PUBLIC.UNKNOWN_TABLE;
SELECT Unknown - INTERVAL '30 minute' FROM PUBLIC.UNKNOWN_TABLE;
SELECT Unknown + INTERVAL '333 hour' FROM PUBLIC.UNKNOWN_TABLE;
SELECT Unknown - INTERVAL '333 hour' FROM PUBLIC.UNKNOWN_TABLE;
SELECT Unknown + INTERVAL '15.6789 second' FROM PUBLIC.UNKNOWN_TABLE;
SELECT Unknown - INTERVAL '15.6789 second' FROM PUBLIC.UNKNOWN_TABLE;
Copy

UDF do Snowflake

SELECT DATEADD_UDF(AsTimeStamp,'INTERVAL ''1-1'' YEAR(2) TO MONTH') FROM PUBLIC.TIMES;
SELECT DATEDIFF_UDF(AsTimeStamp,'INTERVAL ''1-1'' YEAR(2) TO MONTH') FROM PUBLIC.TIMES;
SELECT DATEADD_UDF(AsTimeStamp,'INTERVAL ''2-1'' YEAR(4) TO MONTH') FROM PUBLIC.TIMES;
SELECT DATEDIFF_UDF(AsTimeStamp,'INTERVAL ''2-1'' YEAR(4) TO MONTH') FROM PUBLIC.TIMES;
SELECT DATEADD_UDF(AsTimeStamp,'INTERVAL ''1'' MONTH') FROM PUBLIC.TIMES;
SELECT DATEDIFF_UDF(AsTimeStamp,'INTERVAL ''1'' MONTH') FROM PUBLIC.TIMES;
SELECT DATEADD_UDF(AsTimeStamp,'INTERVAL ''2'' MONTH') FROM PUBLIC.TIMES;
SELECT DATEDIFF_UDF(AsTimeStamp,'INTERVAL ''2'' MONTH') FROM PUBLIC.TIMES;
SELECT DATEADD_UDF(AsTimeStamp,'INTERVAL ''1 01:00:00.222'' DAY TO SECOND(3)') FROM PUBLIC.TIMES;
SELECT DATEDIFF_UDF(AsTimeStamp,'INTERVAL ''1 01:00:00.222'' DAY TO SECOND(3)') FROM PUBLIC.TIMES;
SELECT DATEADD_UDF(AsTimeStamp,'INTERVAL ''1 01:10'' DAY TO MINUTE') FROM PUBLIC.TIMES;
SELECT DATEDIFF_UDF(AsTimeStamp,'INTERVAL ''1 01:10'' DAY TO MINUTE') FROM PUBLIC.TIMES;
SELECT DATEADD_UDF(AsTimeStamp,'INTERVAL ''1 1'' DAY TO HOUR') FROM PUBLIC.TIMES;
SELECT DATEDIFF_UDF(AsTimeStamp,'INTERVAL ''1 1'' DAY TO HOUR') FROM PUBLIC.TIMES;
SELECT DATEADD_UDF(AsTimeStamp,'INTERVAL ''10'' DAY') FROM PUBLIC.TIMES;
SELECT DATEDIFF_UDF(AsTimeStamp,'INTERVAL ''10'' DAY') FROM PUBLIC.TIMES;
SELECT DATEADD_UDF(AsTimeStamp,'INTERVAL ''3:05'' HOUR TO MINUTE') FROM PUBLIC.TIMES;
SELECT DATEDIFF_UDF(AsTimeStamp,'INTERVAL ''3:05'' HOUR TO MINUTE') FROM PUBLIC.TIMES;
SELECT DATEADD_UDF(AsTimeStamp,'INTERVAL ''5'' HOUR') FROM PUBLIC.TIMES;
SELECT DATEDIFF_UDF(AsTimeStamp,'INTERVAL ''5'' HOUR') FROM PUBLIC.TIMES;
SELECT DATEADD_UDF(AsTimeStamp,'INTERVAL ''5:10'' MINUTE TO SECOND') FROM PUBLIC.TIMES;
SELECT DATEDIFF_UDF(AsTimeStamp,'INTERVAL ''5:10'' MINUTE TO SECOND') FROM PUBLIC.TIMES;
SELECT DATEADD_UDF(AsTimeStamp,'INTERVAL ''30'' MINUTE') FROM PUBLIC.TIMES;
SELECT DATEDIFF_UDF(AsTimeStamp,'INTERVAL ''30'' MINUTE') FROM PUBLIC.TIMES;
SELECT DATEADD_UDF(AsTimeStamp,'INTERVAL ''333'' HOUR(3)') FROM PUBLIC.TIMES;
SELECT DATEDIFF_UDF(AsTimeStamp,'INTERVAL ''333'' HOUR(3)') FROM PUBLIC.TIMES;
SELECT DATEADD_UDF(AsTimeStamp,'INTERVAL ''15.6789'' SECOND(2,3)') FROM PUBLIC.TIMES;
SELECT DATEDIFF_UDF(AsTimeStamp,'INTERVAL ''15.6789'' SECOND(2,3)') FROM PUBLIC.TIMES;
SELECT DATEADD_UDF(AsDate,'INTERVAL ''1-1'' YEAR(2) TO MONTH') FROM PUBLIC.TIMES;
SELECT DATEDIFF_UDF(AsDate,'INTERVAL ''1-1'' YEAR(2) TO MONTH') FROM PUBLIC.TIMES;
SELECT DATEADD_UDF(AsDate,'INTERVAL ''2-1'' YEAR(4) TO MONTH') FROM PUBLIC.TIMES;
SELECT DATEDIFF_UDF(AsDate,'INTERVAL ''2-1'' YEAR(4) TO MONTH') FROM PUBLIC.TIMES;
SELECT DATEADD_UDF(AsDate,'INTERVAL ''1'' MONTH') FROM PUBLIC.TIMES;
SELECT DATEDIFF_UDF(AsDate,'INTERVAL ''1'' MONTH') FROM PUBLIC.TIMES;
SELECT DATEADD_UDF(AsDate,'INTERVAL ''2'' MONTH') FROM PUBLIC.TIMES;
SELECT DATEDIFF_UDF(AsDate,'INTERVAL ''2'' MONTH') FROM PUBLIC.TIMES;
SELECT DATEADD_UDF(AsDate,'INTERVAL ''1 01:00:00.222'' DAY TO SECOND(3)') FROM PUBLIC.TIMES;
SELECT DATEDIFF_UDF(AsDate,'INTERVAL ''1 01:00:00.222'' DAY TO SECOND(3)') FROM PUBLIC.TIMES;
SELECT DATEADD_UDF(AsDate,'INTERVAL ''1 01:10'' DAY TO MINUTE') FROM PUBLIC.TIMES;
SELECT DATEDIFF_UDF(AsDate,'INTERVAL ''1 01:10'' DAY TO MINUTE') FROM PUBLIC.TIMES;
SELECT DATEADD_UDF(AsDate,'INTERVAL ''1 1'' DAY TO HOUR') FROM PUBLIC.TIMES;
SELECT DATEDIFF_UDF(AsDate,'INTERVAL ''1 1'' DAY TO HOUR') FROM PUBLIC.TIMES;
SELECT DATEADD_UDF(AsDate,'INTERVAL ''10'' DAY') FROM PUBLIC.TIMES;
SELECT DATEDIFF_UDF(AsDate,'INTERVAL ''10'' DAY') FROM PUBLIC.TIMES;
SELECT DATEADD_UDF(AsDate,'INTERVAL ''3:05'' HOUR TO MINUTE') FROM PUBLIC.TIMES;
SELECT DATEDIFF_UDF(AsDate,'INTERVAL ''3:05'' HOUR TO MINUTE') FROM PUBLIC.TIMES;
SELECT DATEADD_UDF(AsDate,'INTERVAL ''5'' HOUR') FROM PUBLIC.TIMES;
SELECT DATEDIFF_UDF(AsDate,'INTERVAL ''5'' HOUR') FROM PUBLIC.TIMES;
SELECT DATEADD_UDF(AsDate,'INTERVAL ''5:10'' MINUTE TO SECOND') FROM PUBLIC.TIMES;
SELECT DATEDIFF_UDF(AsDate,'INTERVAL ''5:10'' MINUTE TO SECOND') FROM PUBLIC.TIMES;
SELECT DATEADD_UDF(AsDate,'INTERVAL ''30'' MINUTE') FROM PUBLIC.TIMES;
SELECT DATEDIFF_UDF(AsDate,'INTERVAL ''30'' MINUTE') FROM PUBLIC.TIMES;
SELECT DATEADD_UDF(AsDate,'INTERVAL ''333'' HOUR(3)') FROM PUBLIC.TIMES;
SELECT DATEDIFF_UDF(AsDate,'INTERVAL ''333'' HOUR(3)') FROM PUBLIC.TIMES;
SELECT DATEADD_UDF(AsDate,'INTERVAL ''15.6789'' SECOND(2,3)') FROM PUBLIC.TIMES;
SELECT DATEDIFF_UDF(AsDate,'INTERVAL ''15.6789'' SECOND(2,3)') FROM PUBLIC.TIMES;
SELECT DATEADD_UDF(UnKnown,'INTERVAL ''1-1'' YEAR(2) TO MONTH') FROM PUBLIC.UNKNOWN_TABLE;
SELECT DATEDIFF_UDF(UnKnown,'INTERVAL ''1-1'' YEAR(2) TO MONTH') FROM PUBLIC.UNKNOWN_TABLE;
SELECT DATEADD_UDF(UnKnown,'INTERVAL ''2-1'' YEAR(4) TO MONTH') FROM PUBLIC.UNKNOWN_TABLE;
SELECT DATEDIFF_UDF(UnKnown,'INTERVAL ''2-1'' YEAR(4) TO MONTH') FROM PUBLIC.UNKNOWN_TABLE;
SELECT DATEADD_UDF(UnKnown,'INTERVAL ''1'' MONTH') FROM PUBLIC.UNKNOWN_TABLE;
SELECT DATEDIFF_UDF(UnKnown,'INTERVAL ''1'' MONTH') FROM PUBLIC.UNKNOWN_TABLE;
SELECT DATEADD_UDF(UnKnown,'INTERVAL ''2'' MONTH') FROM PUBLIC.UNKNOWN_TABLE;
SELECT DATEDIFF_UDF(UnKnown,'INTERVAL ''2'' MONTH') FROM PUBLIC.UNKNOWN_TABLE;
SELECT DATEADD_UDF(UnKnown,'INTERVAL ''1 01:00:00.222'' DAY TO SECOND(3)') FROM PUBLIC.UNKNOWN_TABLE;
SELECT DATEDIFF_UDF(UnKnown,'INTERVAL ''1 01:00:00.222'' DAY TO SECOND(3)') FROM PUBLIC.UNKNOWN_TABLE;
SELECT DATEADD_UDF(UnKnown,'INTERVAL ''1 01:10'' DAY TO MINUTE') FROM PUBLIC.UNKNOWN_TABLE;
SELECT DATEDIFF_UDF(UnKnown,'INTERVAL ''1 01:10'' DAY TO MINUTE') FROM PUBLIC.UNKNOWN_TABLE;
SELECT DATEADD_UDF(UnKnown,'INTERVAL ''1 1'' DAY TO HOUR') FROM PUBLIC.UNKNOWN_TABLE;
SELECT DATEDIFF_UDF(UnKnown,'INTERVAL ''1 1'' DAY TO HOUR') FROM PUBLIC.UNKNOWN_TABLE;
SELECT DATEADD_UDF(UnKnown,'INTERVAL ''10'' DAY') FROM PUBLIC.UNKNOWN_TABLE;
SELECT DATEDIFF_UDF(UnKnown,'INTERVAL ''10'' DAY') FROM PUBLIC.UNKNOWN_TABLE;
SELECT DATEADD_UDF(UnKnown,'INTERVAL ''3:05'' HOUR TO MINUTE') FROM PUBLIC.UNKNOWN_TABLE;
SELECT DATEDIFF_UDF(UnKnown,'INTERVAL ''3:05'' HOUR TO MINUTE') FROM PUBLIC.UNKNOWN_TABLE;
SELECT DATEADD_UDF(UnKnown,'INTERVAL ''5'' HOUR') FROM PUBLIC.UNKNOWN_TABLE;
SELECT DATEDIFF_UDF(UnKnown,'INTERVAL ''5'' HOUR') FROM PUBLIC.UNKNOWN_TABLE;
SELECT DATEADD_UDF(UnKnown,'INTERVAL ''5:10'' MINUTE TO SECOND') FROM PUBLIC.UNKNOWN_TABLE;
SELECT DATEDIFF_UDF(UnKnown,'INTERVAL ''5:10'' MINUTE TO SECOND') FROM PUBLIC.UNKNOWN_TABLE;
SELECT DATEADD_UDF(UnKnown,'INTERVAL ''30'' MINUTE') FROM PUBLIC.UNKNOWN_TABLE;
SELECT DATEDIFF_UDF(UnKnown,'INTERVAL ''30'' MINUTE') FROM PUBLIC.UNKNOWN_TABLE;
SELECT DATEADD_UDF(UnKnown,'INTERVAL ''333'' HOUR(3)') FROM PUBLIC.UNKNOWN_TABLE;
SELECT DATEDIFF_UDF(UnKnown,'INTERVAL ''333'' HOUR(3)') FROM PUBLIC.UNKNOWN_TABLE;
SELECT DATEADD_UDF(UnKnown,'INTERVAL ''15.6789'' SECOND(2,3)') FROM PUBLIC.UNKNOWN_TABLE;
SELECT DATEDIFF_UDF(UnKnown,'INTERVAL ''15.6789'' SECOND(2,3)') FROM PUBLIC.UNKNOWN_TABLE;
Copy

Resultados

Oracle

Operação do Snowflake

UDF

2022-12-05 11:00:00.000

2022-12-05 11:00:00.000

2022-12-05 11:00:00.000

2020-10-05 11:00:00.000

2020-10-05 11:00:00.000

2020-10-05 11:00:00.000

2023-12-05 11:00:00.000

2023-12-05 11:00:00.000

2023-12-05 11:00:00.000

2019-10-05 11:00:00.000

2019-10-05 11:00:00.000

2019-10-05 11:00:00.000

2021-12-05 11:00:00.000

2021-12-05 11:00:00.000

2021-12-05 11:00:00.000

2021-10-05 11:00:00.000

2021-10-05 11:00:00.000

2021-10-05 11:00:00.000

2022-01-05 11:00:00.000

2022-01-05 11:00:00.000

2022-01-05 11:00:00.000

2021-09-05 11:00:00.000

2021-09-05 11:00:00.000

2021-09-05 11:00:00.000

2021-11-06 12:00:00.222

2021-11-06 12:00:00.222

2021-11-06 12:00:00.222

2021-11-04 09:59:59.778

2021-11-04 09:59:59.778

2021-11-04 09:59:59.778

2021-11-06 12:10:00.000

2021-11-06 12:10:00.000

2021-11-06 12:10:00.000

2021-11-04 09:50:00.000

2021-11-04 09:50:00.000

2021-11-04 09:50:00.000

2021-11-06 12:00:00.000

2021-11-06 12:00:00.000

2021-11-06 12:00:00.000

2021-11-04 10:00:00.000

2021-11-04 10:00:00.000

2021-11-04 10:00:00.000

2021-11-15 11:00:00.000

2021-11-15 11:00:00.000

2021-11-15 11:00:00.000

2021-10-26 11:00:00.000

2021-10-26 11:00:00.000

2021-10-26 11:00:00.000

2021-11-05 14:05:00.000

2021-11-05 14:05:00.000

2021-11-05 14:05:00.000

2021-11-05 07:55:00.000

2021-11-05 07:55:00.000

2021-11-05 07:55:00.000

2021-11-05 16:00:00.000

2021-11-05 16:00:00.000

2021-11-05 16:00:00.000

2021-11-05 06:00:00.000

2021-11-05 06:00:00.000

2021-11-05 06:00:00.000

2021-11-05 11:05:10.000

2021-11-05 11:05:10.000

2021-11-05 11:05:10.000

2021-11-05 10:54:50.000

2021-11-05 10:54:50.000

2021-11-05 10:54:50.000

2021-11-05 11:30:00.000

2021-11-05 11:30:00.000

2021-11-05 11:30:00.000

2021-11-05 10:30:00.000

2021-11-05 10:30:00.000

2021-11-05 10:30:00.000

2021-11-19 08:00:00.000

2021-11-19 08:00:00.000

2021-11-19 08:00:00.000

2021-10-22 14:00:00.000

2021-10-22 14:00:00.000

2021-10-22 14:00:00.000

2021-11-05 11:00:15.679

2021-11-05 11:00:16.000

2021-11-05 11:00:15.678

2021-11-05 10:59:44.321

2021-11-05 10:59:44.000

2021-11-05 11:00:15.678

2022-12-06 00:00:00.000

2022-12-06

2022-12-06

2020-10-06 00:00:00.000

2020-10-06

2020-10-06

2023-12-06 00:00:00.000

2023-12-06

2023-12-06

2019-10-06 00:00:00.000

2019-10-06

2019-10-06

2021-12-06 00:00:00.000

2021-12-06

2021-12-06

2021-12-06 00:00:00.000

2021-10-06

2021-10-06

2022-01-06 00:00:00.000

2022-01-06

2022-01-06

2021-09-06 00:00:00.000

2021-09-06

2021-09-06

2021-11-07 01:00:00.000

2021-11-07 01:00:00.222

2021-11-07

2021-11-04 22:59:59.000

2021-11-04 22:59:59.778

2021-11-04

2021-11-07 01:10:00.000

2021-11-07 01:10:00.000

2021-11-07

2021-11-04 22:50:00.000

2021-11-04 22:50:00.000

2021-11-04

2021-11-07 01:00:00.000

2021-11-07 01:00:00.000

2021-11-07

2021-11-04 23:00:00.000

2021-11-04 23:00:00.000

2021-11-04

2021-11-16 00:00:00.000

2021-11-16

2021-11-16

2021-10-27 00:00:00.000

2021-10-27

2021-10-27

2021-11-06 03:05:00.000

2021-11-06 03:05:00.000

2021-11-06

2021-11-05 20:55:00.000

2021-11-05 20:55:00.000

2021-11-05

2021-11-06 05:00:00.000

2021-11-06 05:00:00.000

2021-11-06

2021-11-05 19:00:00.000

2021-11-05 19:00:00.000

2021-11-05

2021-11-06 00:05:10.000

2021-11-06 00:05:10.000

2021-11-06

2021-11-05 23:54:50.000

2021-11-05 23:54:50.000

2021-11-05

2021-11-06 00:30:00.000

2021-11-06 00:30:00.000

2021-11-06

2021-11-05 23:30:00.000

2021-11-05 23:30:00.000

2021-11-05

2021-11-19 21:00:00.000

2021-11-19 21:00:00.000

2021-11-19

2021-10-23 03:00:00.000

2021-10-23 03:00:00.000

2021-10-23

2021-11-06 00:00:15.000

2021-11-06 00:00:16.000

2021-11-06

2021-11-05 23:59:44.000

2021-11-05 23:59:44.000

2021-11-05

2010-11-01 12:00:00.000

2010-11-01 12:00:00.000

2010-11-01 12:00:00.000

2008-09-01 12:00:00.000

2008-09-01 12:00:00.000

2008-09-01 12:00:00.000

2011-11-01 12:00:00.000

2011-11-01 12:00:00.000

2011-11-01 12:00:00.000

2007-09-01 12:00:00.000

2007-09-01 12:00:00.000

2007-09-01 12:00:00.000

2009-11-01 12:00:00.000

2009-11-01 12:00:00.000

2009-11-01 12:00:00.000

2009-09-01 12:00:00.000

2009-09-01 12:00:00.000

2009-09-01 12:00:00.000

2009-12-01 12:00:00.000

2009-12-01 12:00:00.000

2009-12-01 12:00:00.000

2009-08-01 12:00:00.000

2009-08-01 12:00:00.000

2009-08-01 12:00:00.000

2009-10-02 13:00:00.222

2009-10-02 13:00:00.222

2009-10-02 13:00:00.222

2009-09-30 10:59:59.778

2009-09-30 10:59:59.778

2009-09-30 10:59:59.778

2009-10-02 13:10:00.000

2009-10-02 13:10:00.000

2009-10-02 13:10:00.000

2009-09-30 10:50:00.000

2009-09-30 10:50:00.000

2009-09-30 10:50:00.000

2009-10-02 13:00:00.000

2009-10-02 13:00:00.000

2009-10-02 13:00:00.000

2009-09-30 11:00:00.000

2009-09-30 11:00:00.000

2009-09-30 11:00:00.000

2009-10-11 12:00:00.000

2009-10-11 12:00:00.000

2009-10-11 12:00:00.000

2009-09-21 12:00:00.000

2009-09-21 12:00:00.000

2009-09-21 12:00:00.000

2009-10-01 15:05:00.000

2009-10-01 15:05:00.000

2009-10-01 15:05:00.000

2009-10-01 08:55:00.000

2009-10-01 08:55:00.000

2009-10-01 08:55:00.000

2009-10-01 17:00:00.000

2009-10-01 17:00:00.000

2009-10-01 17:00:00.000

2009-10-01 07:00:00.000

2009-10-01 07:00:00.000

2009-10-01 07:00:00.000

2009-10-01 12:05:10.000

2009-10-01 12:05:10.000

2009-10-01 12:05:10.000

2009-10-01 11:54:50.000

2009-10-01 11:54:50.000

2009-10-01 11:54:50.000

2009-10-01 12:30:00.000

2009-10-01 12:30:00.000

2009-10-01 12:30:00.000

2009-10-01 11:30:00.000

2009-10-01 11:30:00.000

2009-10-01 11:30:00.000

2009-10-15 09:00:00.000

2009-10-15 09:00:00.000

2009-10-15 09:00:00.000

2009-09-17 15:00:00.000

2009-09-17 15:00:00.000

2009-09-17 15:00:00.000

2009-10-01 12:00:15.679

2009-10-01 12:00:16.000

2009-10-01 12:00:15.678

2009-10-01 11:59:44.321

2009-10-01 11:59:44.000

2009-10-01 11:59:44.321

Problemas conhecidos

Não foram encontrados problemas.

EWIs relacionados

  1. SSC-FDM-OR0042: o tipo Date transformado em Timestamp tem um comportamento diferente

Tipos de dados PL SQL

Tipo de dados BINARY_INTEGER

Esse tipo de dados é idêntico ao tipo de dados PLS_INTEGER.

Tipo de dados PLS_INTEGER

Descrição

O tipo de dados PLS_INTEGER armazena números inteiros com sinal no intervalo de -2.147.483.648 a 2.147.483.647, representados em 32 bits. (Tipo de dados PLS_INTEGER da referência de linguagem Oracle)

O tipo de dados PLS_INTEGER é transformado em NUMBER. Essa transformação também se aplica a cada subtipo de PLS_INTEGER:

  • NATURAL

  • NATURALN

  • POSITIVE

  • POSITIVEN

  • SIGNTYPE

  • SIMPLE_INTEGER

Aviso

Alguns destes subtipos não são atualmente reconhecidos pelo SnowConvert AI para que sejam convertidos em VARIANT e consideram tipos definidos pelo usuário. Já existe um item de trabalho para corrigir o problema.

Amostra de padrões da origem

Considere a tabela a seguir e suas inserções para os exemplos abaixo:

Código

CREATE TABLE PLS_INTEGER_TABLE(
	COL NUMBER
);
Copy

Uso de PLS_INTEGER em blocos processuais

Oracle
CREATE OR REPLACE PROCEDURE PLS_INTEGER_EXAMPLE
IS
-- PLS_INTEGER AND BINARY INTEGER ALIASES
PLS_INTEGER_VAR PLS_INTEGER;
BINARY_INTEGER_VAR BINARY_INTEGER;

NUMBER_VAR NUMBER;
BEGIN
	NUMBER_VAR := 2;

	-- maximum possible value
	PLS_INTEGER_VAR := 2147483647;
	
	-- implicit cast to number
	INSERT INTO PLS_INTEGER_TABLE (COL) VALUES (PLS_INTEGER_VAR);
	PLS_INTEGER_VAR := 2147483647;
	
	-- operations with other numeric expressions
	INSERT INTO PLS_INTEGER_TABLE (COL) VALUES (PLS_INTEGER_VAR + 1);
	INSERT INTO PLS_INTEGER_TABLE (COL) VALUES (PLS_INTEGER_VAR + NUMBER_VAR);
END;

CALL PLS_INTEGER_EXAMPLE();
SELECT * FROM PLS_INTEGER_TABLE;
Copy
Resultado

COL

2147483647

2147483648

2147483649

Snowflake
CREATE OR REPLACE PROCEDURE PLS_INTEGER_EXAMPLE ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
	DECLARE
		-- PLS_INTEGER AND BINARY INTEGER ALIASES
		PLS_INTEGER_VAR NUMBER;
		BINARY_INTEGER_VAR NUMBER;

		NUMBER_VAR NUMBER(38, 18);
	BEGIN
		NUMBER_VAR := 2;
	-- maximum possible value
		PLS_INTEGER_VAR := 2147483647;

		-- implicit cast to number
		INSERT INTO PLS_INTEGER_TABLE(COL) VALUES (:PLS_INTEGER_VAR);
		PLS_INTEGER_VAR := 2147483647;

	-- operations with other numeric expressions
	INSERT INTO PLS_INTEGER_TABLE(COL) VALUES (:PLS_INTEGER_VAR + 1);
	INSERT INTO PLS_INTEGER_TABLE(COL) VALUES (:PLS_INTEGER_VAR + :NUMBER_VAR);
	END;
$$;

CALL PLS_INTEGER_EXAMPLE();

SELECT * FROM
	PLS_INTEGER_TABLE;
Copy
Resultado

COL

2147483647

2147483648

2147483649

Problemas conhecidos

1. Storage and performance features were not preserved

O Oracle PLS_INTEGER tem algumas vantagens em termos de tamanho de armazenamento e desempenho em operações aritméticas. Esses recursos não foram emulados porque o Snowflake NUMBER não os possui. Para obter mais informações, consulte a documentação do PLS_INTEGER.

EWIs relacionados

Sem EWIs relacionados.

Tipos de dados de caracteres

Os tipos de dados de caracteres armazenam dados de caracteres (alfanuméricos), que são palavras e texto de forma livre, no conjunto de caracteres de banco de dados ou conjunto de caracteres nacionais. (Tipos de dados de caracteres de referência de linguagem Oracle SQL)

Tipo de dados CHAR

Descrição

O tipo de dados CHAR especifica uma cadeia de caracteres de comprimento fixo no conjunto de caracteres do banco de dados. (Tipo de dados CHAR da referência de linguagem Oracle SQL)

Conforme indicado na documentação do Oracle, o tamanho no tipo de dados CHAR é uma restrição de comprimento e não deve ser confundido com capacidade. O total de caracteres que podem ser armazenados em um CHAR pode variar de acordo com o conjunto de caracteres e a configuração do banco de dados, mas geralmente o tamanho máximo permitido é 2000.

No Snowflake, os tipos CHAR são sinônimos de VARCHAR e, como você pode conferir aqui:

Tipos de dados de texto da referência de linguagem Snowflake SQL

O tamanho máximo padrão é bem maior. No entanto, isso não significa que um Snowflake VARCHAR consumirá mais armazenamento, conforme mencionado na documentação:

Uma cadeia de 1 caractere em uma coluna VARCHAR(16777216) consome apenas um único caractere.

CHAR [ (size [ BYTE | CHAR ]) ]
Copy

Amostra de padrões da origem

Tipos de dados Char em Create Table

Oracle
CREATE TABLE char_data_types
(
	char_column1 CHAR,
	char_column2 CHAR(15),
	char_column3 CHAR(15 BYTE),
	char_column4 CHAR(15 CHAR)
);

INSERT INTO char_data_types VALUES ('H', 'Hello world', 'Hello world', 'Hello world');
Copy
Snowflake
CREATE OR REPLACE TABLE char_data_types
(
	char_column1 CHAR,
	char_column2 CHAR(15),
	char_column3 CHAR(15),
	char_column4 CHAR(15)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;

INSERT INTO char_data_types
VALUES ('H', 'Hello world', 'Hello world', 'Hello world');
Copy

Recuperação de dados de colunas char

Oracle
SELECT * FROM char_data_types;
Copy
Resultado

CHAR_COLUMN1

CHAR_COLUMN2

CHAR_COLUMN3

CHAR_COLUMN4

H

Hello world

Hello world

Hello world

Snowflake
SELECT * FROM
char_data_types;
Copy
Resultado

CHAR_COLUMN1

CHAR_COLUMN2

CHAR_COLUMN3

CHAR_COLUMN4

H

Hello world

Hello world

Hello world

Nota

No Oracle, o valor é preenchido com espaços vazios para se ajustar ao tamanho fixo determinado na definição da coluna. Por outro lado, o Snowflakes usa o tamanho dinâmico (mantendo a restrição de comprimento) para armazenar o valor.

Verificação de tipos de dados internos para CHAR

Conforme mencionado no início, o Snowflake usa internamente um VARCHAR para as colunas do tipo CHAR. Podemos confirmar isso descrevendo as tabelas:

Oracle

Snowflake

Nota

A restrição de comprimento é preservada, mas a memória que as colunas estão usando é diferente em cada DBMS.

Recuperação do tamanho em bytes de cada coluna:

Oracle
SELECT 
LENGTHB(char_column1),
LENGTHB(char_column2),
LENGTHB(char_column3),
LENGTHB(char_column4)  
FROM char_data_types;
Copy
Resultado

LENGTHB(CHAR_COLUMN1)

LENGTHB(CHAR_COLUMN2)

LENGTHB(CHAR_COLUMN3)

LENGTHB(CHAR_COLUMN4)

1

15

15

15

Snowflake
SELECT
OCTET_LENGTH(char_column1) /*** SSC-FDM-OR0015 - LENGTHB TRANSFORMED TO OCTET_LENGTH RESULTS MAY VARY DUE TO MEMORY MANAGEMENT OF DBMS ***/,
OCTET_LENGTH(char_column2) /*** SSC-FDM-OR0015 - LENGTHB TRANSFORMED TO OCTET_LENGTH RESULTS MAY VARY DUE TO MEMORY MANAGEMENT OF DBMS ***/,
OCTET_LENGTH(char_column3) /*** SSC-FDM-OR0015 - LENGTHB TRANSFORMED TO OCTET_LENGTH RESULTS MAY VARY DUE TO MEMORY MANAGEMENT OF DBMS ***/,
OCTET_LENGTH(char_column4) /*** SSC-FDM-OR0015 - LENGTHB TRANSFORMED TO OCTET_LENGTH RESULTS MAY VARY DUE TO MEMORY MANAGEMENT OF DBMS ***/
FROM
char_data_types;
Copy
Resultado

OCTET_LENGTH(CHAR_COLUMN1)

OCTET_LENGTH(CHAR_COLUMN2)

OCTET_LENGTH(CHAR_COLUMN3)

OCTET_LENGTH(CHAR_COLUMN4)

1

11

11

11

Observação

Além dessas pequenas diferenças, a integridade dos dados é preservada.

Problemas conhecidos

1. Os resultados obtidos com algumas funções incorporadas podem variar

Conforme explicado na seção anterior, pode haver casos em que o uso de funções incorporadas nas colunas pode gerar resultados diferentes. Por exemplo, obter o comprimento de uma coluna.

EWIs relacionados

  1. SSC-FDM-OR0015: LENGTHB transformado em OCTET_LENGTH.

Tipo de dados NCHAR

Descrição

O tipo de dados NCHAR especifica uma cadeia de caracteres de comprimento fixo no conjunto de caracteres nacionais. (Referência da linguagem Oracle SQL NCHAR)

NCHAR permite armazenar caracteres especiais com seu Unicode para serem preservados em qualquer uso; esses caracteres especiais podem precisar de mais bits para serem armazenados e é por isso que, por padrão, o conjunto de caracteres NCHAR é AL16UTF16, ao contrário do conjunto de dados de caracteres comuns para CHAR, que geralmente é AL32UTF8.

NCHAR é preservado como NCHAR no Snowflake, mas, em segundo plano, o Snowflake usa VARCHAR. As informações de transformação relacionadas a CHAR também são válidas para NCHAR.

NCHAR [ (size) ]

Copy

Padrões de fontes de amostra

Tipos de dados Nchar em Create Table

Oracle
CREATE TABLE nchar_data_types
(
	nchar_column1 NCHAR,
	nchar_column2 NCHAR(5)
);

INSERT INTO nchar_data_types VALUES ('ភ', 'ភាសាខ');
Copy
Snowflake
CREATE OR REPLACE TABLE nchar_data_types
(
	nchar_column1 NCHAR,
	nchar_column2 NCHAR(5)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;

INSERT INTO nchar_data_types
VALUES ('ភ', 'ភាសាខ');
Copy

Nota

No Oracle, a tentativa de inserir esses valores em uma coluna CHAR com o mesmo tamanho acionará um erro: value too large for column.

Recuperação de informações de colunas Nchar

Oracle
SELECT * FROM nchar_data_types;
Copy
Resultado

NCHAR_COLUMN1

NCHAR_COLUMN2

ភាសាខ

Snowflake
SELECT * FROM
nchar_data_types;
Copy
Resultado

NCHAR_COLUMN1

NCHAR_COLUMN2

ភាសាខ

Recuperação do tamanho em bytes de cada coluna

Oracle
SELECT 
LENGTHB(nchar_column1),
LENGTHB(nchar_column2)
FROM nchar_data_types;
Copy
Resultado

LENGTHB(NCHAR_COLUMN1)

LENGTHB(NCHAR_COLUMN2)

                 2|                    10|
Copy
Snowflake
SELECT
OCTET_LENGTH(nchar_column1) /*** SSC-FDM-OR0015 - LENGTHB TRANSFORMED TO OCTET_LENGTH RESULTS MAY VARY DUE TO MEMORY MANAGEMENT OF DBMS ***/,
OCTET_LENGTH(nchar_column2) /*** SSC-FDM-OR0015 - LENGTHB TRANSFORMED TO OCTET_LENGTH RESULTS MAY VARY DUE TO MEMORY MANAGEMENT OF DBMS ***/
FROM
nchar_data_types;
Copy
Resultado

OCTET_LENGTH(NCHAR_COLUMN1)

OCTET_LENGTH(NCHAR_COLUMN2)

                      3|                         15|
Copy

Observe que o número especificado na declaração da coluna é o tamanho em caracteres e não em bytes. É por isso que vemos mais espaço usado para armazenar esses caracteres especiais.

Nota

No Snowflake, VARCHAR usa UTF-8, o tamanho pode variar dependendo do caractere Unicode que pode ser representado em 1, 2, 3 ou 4 bytes. Nesse caso, o caractere cambojano está usando 3 bytes para ser armazenado.

Observação

Além dessas pequenas diferenças, a integridade dos dados é preservada.

Problemas conhecidos

1. Os resultados obtidos com algumas funções incorporadas podem variar

Conforme explicado na seção anterior, pode haver casos em que o uso de funções incorporadas nas colunas pode gerar resultados diferentes. Por exemplo, obter o comprimento de uma coluna.

EWIs relacionados

  1. SSC-FDM-OR0015: LENGTHB transformado em OCTET_LENGTH.

Tipo de dados NVARCHAR2

Descrição

O tipo de dados NVARCHAR2 especifica uma cadeia de caracteres de comprimento variável no conjunto de caracteres nacionais. (Referência da linguagem Oracle SQL NVARCHAR2)

NVARCHAR2 (size)

Copy

NVARCHAR2 permite armazenar caracteres especiais com seu Unicode para serem preservados em qualquer uso; esses caracteres especiais podem precisar de mais bits para serem armazenados e é por isso que, por padrão, o conjunto de caracteres NVARCHAR2 é AL16UTF16, ao contrário do conjunto de dados de caracteres comuns para VARCHAR2, que geralmente é AL32UTF8.

NVARCHAR transformado em Snowflake VARCHAR, Informações de transformação relacionadas ao VARCHAR2, também é válido para NVARCHAR2.

NVARCHAR2 (size)

Copy

Padrões de fontes de amostra

Tipo de dados Nvarchar2 em Create Table

Oracle
CREATE TABLE nvarchar2_data_types
(
	nvarchar2_column NVARCHAR2 (5)
);

INSERT INTO nvarchar2_data_types VALUES ('ភាសាខ');
Copy
Snowflake
CREATE OR REPLACE TABLE nvarchar2_data_types
	(
		nvarchar2_column VARCHAR(5)
	)
	COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
	;

	INSERT INTO nvarchar2_data_types
	VALUES ('ភាសាខ');
Copy

Nota

No Oracle, a tentativa de inserir esses valores em uma coluna VARCHAR2 com o mesmo tamanho acionará um erro: value too large for column.

Recuperação de informações de colunas Nchar

Oracle
SELECT * FROM nvarchar2_data_types;
Copy
Resultado

NVARCHAR2_COLUMN

ភាសាខ

Snowflake
SELECT * FROM
nvarchar2_data_types;
Copy
Resultado

NVARCHAR2_COLUMN

ភាសាខ

Recuperação do tamanho em bytes de cada coluna

Oracle
SELECT 
LENGTHB(nvarchar2_column)
FROM nvarchar2_data_types;
Copy
Resultado

LENGTHB(NVARCHAR2_COLUMN)

10

Snowflake
SELECT
OCTET_LENGTH(nvarchar2_column) /*** SSC-FDM-OR0015 - LENGTHB TRANSFORMED TO OCTET_LENGTH RESULTS MAY VARY DUE TO MEMORY MANAGEMENT OF DBMS ***/
FROM
nvarchar2_data_types;
Copy
Resultado

OCTET_LENGTH(NVARCHAR2_COLUMN)

15

Observe que o número especificado na declaração da coluna é o tamanho em caracteres e não em bytes. É por isso que vemos mais espaço usado para armazenar esses caracteres especiais.

Nota

No Snowflake, VARCHAR usa UTF-8, o tamanho pode variar dependendo do caractere Unicode que pode ser representado em 1, 2, 3 ou 4 bytes. Nesse caso, os caracteres cambojanos estão usando 3 bytes para serem armazenados.

Observação

Além dessas pequenas diferenças, a integridade dos dados é preservada.

Problemas conhecidos

1. Os resultados obtidos com algumas funções incorporadas podem variar

Conforme explicado na seção anterior, pode haver casos em que o uso de funções incorporadas nas colunas pode gerar resultados diferentes. Por exemplo, obter o comprimento de uma coluna.

EWIs relacionados

  1. SSC-FDM-OR0015: LENGTHB transformado em OCTET_LENGTH.

Tipo de dados VARCHAR

Descrição

A Oracle recomenda o uso de VARCHAR2 em vez de VARCHAR, conforme explicado em sua documentação:

Varchar da referência de linguagem Oracle SQL

Mesmo assim, a sintaxe é analisada e transformada usando os tipos de dados ANSI, DB2 e SQL/DS.

Tipo de dados VARCHAR2

Descrição

O tipo de dados VARCHAR2 especifica uma cadeia de caracteres de comprimento variável no conjunto de caracteres do banco de dados. (Referência da linguagem Oracle SQL VARCHAR2)

Conforme indicado na documentação do Oracle, o tamanho no tipo de dados VARCHAR2 é uma restrição de comprimento e não deve ser confundido com capacidade. O total de caracteres que podem ser armazenados em um VARCHAR2 pode variar de acordo com o conjunto de caracteres e a configuração do banco de dados, mas geralmente o tamanho máximo permitido é 4000.

VARCHAR2 é convertido para o Snowflake VARCHAR, que pode armazenar um número maior de bytes/caracteres por padrão. De qualquer forma, a memória usada é variável, usando o tamanho do valor armazenado na coluna, da mesma forma que no Oracle.

VARCHAR2 (size [ BYTE | CHAR ])
Copy

Amostra de padrões da origem

Tipos de dados Varchar2 em Create Table

Oracle
CREATE TABLE varchar2_data_types
(
	varchar2_column1 VARCHAR2(5),
	varchar2_column2 VARCHAR2(5 BYTE),
	varchar2_column3 VARCHAR2(5 CHAR)
);

INSERT INTO varchar2_data_types VALUES ('H', 'Hello', 'Hell');
Copy
Snowflake
CREATE OR REPLACE TABLE varchar2_data_types
	(
		varchar2_column1 VARCHAR(5),
		varchar2_column2 VARCHAR(5),
		varchar2_column3 VARCHAR(5)
	)
	COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
	;

	INSERT INTO varchar2_data_types
	VALUES ('H', 'Hello', 'Hell');
Copy

Recuperação de dados de colunas varchar

Oracle
SELECT * FROM varchar2_data_types;
Copy
Resultado

VARCHAR2_COLUMN1

VARCHAR2_COLUMN2

VARCHAR2_COLUMN3

H

Hello

Hell

Snowflake
SELECT * FROM
varchar2_data_types;
Copy
Resultado

VARCHAR2_COLUMN1

VARCHAR2_COLUMN2

VARCHAR2_COLUMN3

H

Hello

Hell

Revisão do tamanho da variável nas colunas

Oracle
SELECT
LENGTHB(varchar2_column1),
LENGTHB(varchar2_column2),
LENGTHB(varchar2_column3) 
FROM VARCHAR2_DATA_TYPES;
Copy
Resultado

LENGTHB(VARCHAR2_COLUMN1)

LENGTHB(VARCHAR2_COLUMN2)

LENGTHB(VARCHAR2_COLUMN3)

1

5

4

Snowflake
SELECT
OCTET_LENGTH(varchar2_column1) /*** SSC-FDM-OR0015 - LENGTHB TRANSFORMED TO OCTET_LENGTH RESULTS MAY VARY DUE TO MEMORY MANAGEMENT OF DBMS ***/,
OCTET_LENGTH(varchar2_column2) /*** SSC-FDM-OR0015 - LENGTHB TRANSFORMED TO OCTET_LENGTH RESULTS MAY VARY DUE TO MEMORY MANAGEMENT OF DBMS ***/,
OCTET_LENGTH(varchar2_column3) /*** SSC-FDM-OR0015 - LENGTHB TRANSFORMED TO OCTET_LENGTH RESULTS MAY VARY DUE TO MEMORY MANAGEMENT OF DBMS ***/
FROM
VARCHAR2_DATA_TYPES;
Copy
Resultado

OCTET_LENGTH(VARCHAR2_COLUMN1)

OCTET_LENGTH(VARCHAR2_COLUMN2)

OCTET_LENGTH(VARCHAR2_COLUMN3)

1

5

4

Problemas conhecidos

Não foram encontrados problemas.

EWIs relacionados

  1. SSC-FDM-OR0015: LENGTHB transformado em OCTET_LENGTH.

Tipos de dados de LOB

Descrição

Os tipos de dados LOB BLOB, CLOB e NCLOB (armazenados internamente) e BFILE (armazenados externamente) podem armazenar dados grandes e não estruturados, como texto, imagem, vídeo e dados espaciais. (Tipo de dados LOB da referência de linguagem Oracle SQL)

BFILE
BLOB
CLOB
NCLOB
Copy

Aviso

Tipos de dados LOB não são compatíveis com o Snowflake. De acordo com a documentação do Snowflake, é recomendável transformar CLOB em VARCHAR e BLOB em BINARY. No entanto, há várias limitações. {% endhint %}

Aviso

As propriedades LOB das tabelas também não são compatíveis com o Snowflake. {% endhint %}

Tipo de dados BFILE

Description

Contém um localizador para um grande arquivo binário armazenado fora do banco de dados. Permite o acesso de E/S de fluxo de bytes a LOBs externos que residem no servidor de banco de dados. Uma coluna ou atributo BFILE armazena um localizador BFILE, que funciona como um ponteiro para um arquivo binário no sistema de arquivos do servidor. O localizador mantém o nome do diretório e o nome do arquivo. (Tipo de dados BFILE da referência de linguagem Oracle SQL).

Aviso

O tipo de dados BFILE não é suportado no Snowflake. VARCHAR é usado em seu lugar.

Amostra de padrões da origem

Tipo de dados Bfile em Create Table

Aviso

As colunas do Oracle BFILE são usadas para armazenar um localizador com o diretório e o nome do arquivo. Eles são alterados para Snowflake VARCHAR a fim de armazenar o diretório e o nome do arquivo na coluna. No entanto, o carregamento do conteúdo do arquivo deve ser feito manualmente.

Oracle
--Create Table
CREATE TABLE bfile_table 
(
    col1 BFILE 
);

--Insert Bfilename
INSERT INTO bfile_table VALUES (
    BFILENAME('mydirectory', 'myfile.png')
);

--Select
SELECT * FROM bfile_table;
Copy
Resultado

COL1

[BFILE:myfile.png]

Snowflake
--Create Table
CREATE OR REPLACE TABLE bfile_table
    (
        col1
    !!!RESOLVE EWI!!! /*** SSC-EWI-OR0105 - ADDITIONAL WORK IS NEEDED FOR BFILE COLUMN USAGE. BUILD_STAGE_FILE_URL FUNCTION IS A RECOMMENDED WORKAROUND ***/!!!
    VARCHAR
    )
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;

--Insert Bfilename
INSERT INTO bfile_table
VALUES (PUBLIC.BFILENAME_UDF('mydirectory', 'myfile.png')
);

--Select
SELECT * FROM
    bfile_table;
Copy
Resultado

COL1

mydirectory\myfile.png

Aviso

UDF adicionado para substituir BFILENAME().

UDF Adicionado

CREATE OR REPLACE FUNCTION PUBLIC.BFILENAME_UDF (DIRECTORYNAME STRING, FILENAME STRING)
RETURNS STRING
LANGUAGE SQL
IMMUTABLE 
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"udf"}}'
AS
$$
	DIRECTORYNAME || '\\' || FILENAME
$$;
Copy

Problemas conhecidos

1. No access to the DBMS_LOB built-in package

Como os tipos de dados LOB não são compatíveis com o Snowflake, não há equivalente para as funções DBMS_LOB e ainda não há soluções alternativas implementadas.

EWIs relacionados

  1. SSC-EWI-OR0105: Trabalho adicional é necessário para o uso da coluna BFILE. A função BUILD_STAGE_URL é uma solução alternativa recomendada.

Tipo de dados BLOB

Descrição

O tipo de dados BLOB armazena objetos grandes binários não estruturados. Os objetos BLOB podem ser considerados fluxos de bits sem semântica de conjunto de caracteres. (Tipo de dados BLOB da referência de linguagem Oracle SQL).

Aviso

O tipo de dados BLOB não é suportado no Snowflake. BINARY é usado em seu lugar.

Amostra de padrões da origem

BLOB em Create Table

Oracle
CREATE TABLE blobtable( blob_column BLOB, empty_column BLOB );

INSERT INTO blobtable VALUES (NULL, EMPTY_BLOB());
Copy
Snowflake
CREATE OR REPLACE TABLE blobtable ( blob_column BINARY,
empty_column BINARY
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;

INSERT INTO blobtable
VALUES (NULL, TO_BINARY(' '));
Copy

Recuperação de dados

Oracle
SELECT * FROM blobtable;
Copy
Resultado

BLOB_COLUMN

EMPTY_COLUMN

[NULL]

[BLOB]

Snowflake
SELECT * FROM
blobtable;
Copy
Resultado

BLOB_COLUMN

EMPTY_COLUMN

NULL

Exemplo funcional

Aviso

Este exemplo não é uma tradução do SnowConvert AI, ele é usado apenas para mostrar a equivalência funcional entre Oracle BLOB e Snowflake BINARY

Aviso

Estamos usando as funções «utl_raw.cast_to_raw» e «DBMS_LOB.SUBSTR». No momento, a conversão para essas funções não é compatível com o SnowConvert.

Oracle
INSERT INTO blobtable VALUES(
utl_raw.cast_to_raw('hello world'), EMPTY_BLOB());

SELECT DBMS_LOB.SUBSTR(blob_column) AS result
FROM blobtable;
Copy
Resultado

RESULT

[NULL]

hello world

Snowflake
INSERT INTO blobtable
VALUES(
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0076 - TRANSLATION FOR BUILT-IN PACKAGE 'utl_raw.cast_to_raw' IS NOT CURRENTLY SUPPORTED. ***/!!!
'' AS cast_to_raw, TO_BINARY(' '));


SELECT
SUBSTR(blob_column, 1) AS result
FROM
blobtable;
Copy
Resultado

RESULT

[NULL]

hello world

Problemas conhecidos

1. The difference in max length BLOB (Oracle) and BINARY (Snowflake)

O tamanho máximo de uma coluna Oracle BLOB é (4 gigabytes - 1) * (tamanho do bloco de banco de dados) , mas o Snowflake BINARY está limitado a 8MB.

2. Empty value with EMPTY_BLOB

A inicialização de uma coluna usando EMPTY_BLOB() retornará um localizador LOB vazio. Após a conversão, a coluna retornará uma cadeia de caracteres com “ “.

3. No access to the DBMS_LOB built-in package

Como os tipos de dados LOB não são compatíveis com o Snowflake, não há equivalente para as funções DBMS_LOB e ainda não há soluções alternativas implementadas.

EWIs relacionados

  1. SSC-EWI-OR0076: pacote interno incompatível.

Tipo de dados CLOB

Descrição

Um objeto de caractere grande que contém caracteres de byte único ou de vários bytes. Há suporte para conjuntos de caracteres de largura fixa e variável, ambos usando o conjunto de caracteres do banco de dados. (Tipo de dados CLOB da referência de linguagem Oracle SQL).

Aviso

O tipo de dados CLOB não é suportado no Snowflake. VARCHAR é usado em seu lugar.

Amostra de padrões da origem

CLOB em Create Table

Oracle
CREATE TABLE clobtable ( clob_column CLOB, empty_column CLOB );

INSERT INTO clobtable VALUES ( 'THIS IS A TEST', EMPTY_CLOB() );
Copy
Snowflake
CREATE OR REPLACE TABLE clobtable ( clob_column VARCHAR,
empty_column VARCHAR
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;

INSERT INTO clobtable
VALUES ( 'THIS IS A TEST', TO_VARCHAR(' - '));
Copy

Recuperação de dados

Oracle
SELECT * FROM clobtable;
Copy
Resultado

CLOB_COLUMN

EMPTY_COLUMN

THIS IS A TEST

Snowflake
SELECT * FROM
clobtable;
Copy
Resultado

CLOB_COLUMN

EMPTY_COLUMN

THIS IS A TEST

-

Problemas conhecidos

1. The difference in max length CLOB (Oracle) and VARCHAR (Snowflake)

O tamanho máximo de uma coluna Oracle CLOB é (4 gigabytes - 1) * (tamanho do bloco de banco de dados) , mas o Snowflake VARCHAR está limitado a 16MB.

2. Empty value with EMPTY_CLOB

A inicialização de uma coluna usando EMPTY_CLOB() retornará um localizador LOB vazio. Já no Snowflake, após a conversão, a coluna retornará uma cadeia de caracteres com “ - “.

3. No access to the DBMS_LOB built-in package

Como os tipos de dados LOB não são compatíveis com o Snowflake, não há um equivalente para as funções DBMS_LOB e ainda não há soluções alternativas implementadas.

EWIs relacionados

Sem EWIs relacionados.

Tipo de dados NCLOB

Descrição

Um objeto de caractere grande que contém caracteres Unicode. Há suporte para conjuntos de caracteres de largura fixa e variável, ambos usando o conjunto de caracteres nacionais do banco de dados. (Tipo de dados NCLOB da referência de linguagem Oracle SQL).

Aviso

O tipo de dados NCLOB não é suportado no Snowflake. VARCHAR é usado em seu lugar.

Amostra de padrões da origem

NCLOB em Create Table

Oracle
CREATE TABLE nclobtable ( nclob_column NCLOB, empty_column NCLOB );

INSERT INTO nclobtable VALUES ( 'THIS IS A TEST', EMPTY_CLOB() );
Copy
Snowflake
CREATE OR REPLACE TABLE nclobtable ( nclob_column VARCHAR,
empty_column VARCHAR
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;

INSERT INTO nclobtable
VALUES ( 'THIS IS A TEST', TO_VARCHAR(' - '));
Copy

Recuperação de dados

Oracle
SELECT * FROM nclobtable;
Copy
Resultado

NCLOB_COLUMN

EMPTY_COLUMN

THIS IS A TEST

Snowflake
SELECT * FROM
nclobtable;
Copy
Resultado

NCLOB_COLUMN

EMPTY_COLUMN

THIS IS A TEST

-

Problemas conhecidos

1. The difference in max length CLOB (Oracle) and VARCHAR (Snowflake)

O tamanho máximo de uma coluna Oracle NCLOB é (4 gigabytes - 1) * (tamanho do bloco de banco de dados) , mas o Snowflake VARCHAR está limitado a 16MB.

2. Empty value with EMPTY_CLOB

A inicialização de uma coluna usando EMPTY_CLOB() retornará um localizador LOB vazio. Após a conversão, a coluna retornará uma cadeia de caracteres com “ - “.

3. No access to the DBMS_LOB built-in package

Como os tipos de dados LOB não são compatíveis com o Snowflake, não há um equivalente para as funções DBMS_LOB e ainda não há soluções alternativas implementadas.

EWIs relacionados

Sem EWIs relacionados.