SnowConvert AI - Oracle - Types de données intégrés Oracle

Types de données étendus

Description

À partir de la base de données Oracle 12_c_, vous pouvez spécifier une taille maximale de 32767 octets pour les types de données VARCHAR2, NVARCHAR2 et RAW. Vous pouvez contrôler si votre base de données prend en charge cette nouvelle taille maximale en réglant le paramètre d’initialisation MAX_STRING_SIZE.

Un type de données VARCHAR2 ou NVARCHAR2 dont la taille déclarée est supérieure à 4 000 octets, ou un type de données RAW dont la taille déclarée est supérieure à 2 000 octets, est un type de données étendu********. (Référence linguistique Oracle SQL Type de données étendu).

Oracle permet d’augmenter la taille maximale de la chaîne de la base de données de STANDARD à EXTENDED, mais Snowflake ne contient pas d’équivalent pour cette fonctionnalité.

Par conséquent les types de données étendus VARCHAR2, NVARCHAR2 et RAW ne sont pas pris en charge dans Snowflake et ils sont transformés comme de simples types de données VARCHAR2, NVARCHAR2 et RAW. Consultez Données de type caractères et Types de données RAW pour plus d’informations.

Problèmes connus

1. MAX STRING SIZE not recognized

ALTER SYSTEM SET MAX_STRING_SIZE='EXTENDED';

N’est pas analysé par SnowConvert.

Type de données JSON

Description

Oracle Database prend en charge JSON de manière native avec les fonctions des bases de données relationnelles, notamment les transactions, l’indexation, la requête déclarative et les vues. Contrairement aux données relationnelles, les données JSON peuvent être stockées dans la base de données, indexées et interrogées sans qu’un schéma définissant les données ne soit nécessaire. (Référence linguistique Oracle SQL Type de données JSON).

Les types de données JSON sont transformés en VARIANT afin d’émuler le comportement d’Oracle.

JSON
Copy

Modèles d’échantillons de sources

Type de données JSON en tant que colonne dans 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
Résultat

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

Avertissement

Les insertions de données JSON ne sont pas traitées correctement. Consultez la section Recommandations pour connaître les solutions de contournement.

Problèmes connus

1. Insertions de données JSON

Les insertions de données JSON ne sont pas correctement gérées par SnowConvert.

2. Manipulation d’objets JSON

Les utilisations des objets JSON (colonnes, variables ou paramètres) ne sont pas correctement convertis par SnowConvert AI. Consultez la section Recommandations pour connaître les solutions de contournement

Recommandations

1. JSON Data Type translation workaround

Le type de données JSON est traduit en VARIANT, de sorte que l’information peut être formatée à l’aide de la fonction Snowflake PARSE_JSON. Cette approche vous permettra de stocker, d’interroger et d’opérer les données JSON dans Snowflake en utilisant une syntaxe similaire à celle d’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
Résultat 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 »}}

Résultat 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
Résultat 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}

Résultat 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

Note

Vous devez utiliser SELECT comme argument INSERT INTO au lieu de la clause VALUES pour utiliser la fonction PARSE_JSON.

Note

Utilisez l’opérateur « : » au lieu de « . » pour accéder aux propriétés de l’objet JSON. Permet plusieurs niveaux d’imbrication dans les deux moteurs.

EWIs connexes

  1. SSC-EWI-0073: Examen de l’équivalence fonctionnelle en attente.

Type de données LONG

Les colonnes LONG stockent des chaînes de caractères de longueur variable contenant jusqu’à 2 gigaoctets -1, soit 231-1 octets. Les colonnes LONG présentent un grand nombre de caractéristiques des colonnes VARCHAR2. Vous pouvez utiliser les colonnes LONG pour stocker de longues chaînes de texte. La longueur des valeurs LONG peut être limitée par la mémoire disponible sur votre ordinateur. (Référence linguistique Oracle SQL Type de données Long)

LONG
Copy

Modèles d’échantillons de sources

Long dans 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

Récupération des données d’une colonne Long

Oracle
SELECT long_column FROM long_table;
Copy
Résultat

LONG_COLUMN

il s’agit d’un texte

Snowflake
SELECT long_column FROM
long_table;
Copy
Résultat

LONG_COLUMN

il s’agit d’un texte

Problèmes connus

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

Selon la documentation d’Oracle, la colonne Long peut stocker jusqu’à 2 gigaoctets de données, alors que la colonne Varchar de Snowflake est limitée à 16 Mo.

2. Cast of Long column

Le type de données Long ne peut être converti qu’en type de données CLOB, et la seule façon d’y parvenir est d’utiliser la fonction TO_LOB , cette fonction ne fonctionne que si elle est utilisée dans la liste de sélection d’une sous-requête d’une instruction INSERT. Considérez l’échantillon suivant

Oracle
CREATE TABLE target_table (col CLOB);

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

Avertissement

Si le type de données de la colonne de la table cible est différent de CLOB, Oracle peut insérer des valeurs nulles ou afficher une erreur lors de la tentative d’insertion des données.

EWIs connexes

  1. SSC-FDM-0006: La colonne Number Type peut ne pas se comporter de la même manière dans Snowflake.

Types de données RAW et LONG RAW

Description

Les types de données RAW et LONG RAW stockent des données qui ne doivent pas être explicitement converties par Oracle Database lors du déplacement de données entre différents systèmes. Ces types de données sont destinés aux données binaires ou aux chaînes d’octets. (Référence linguistique Oracle SQL Types de données Row et Long Raw)

{ LONG RAW | RAW (size) }
Copy

Modèles d’échantillons de sources

Raw et Long Raw dans 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

Récupération de données des colonnes Raw et Long Raw

Oracle
SELECT * FROM raw_table ORDER BY id;
Copy
Résultat

ID

RAW_COLUMN

LONG_RAW_COLUMN

1

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

2

ªªªªª

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

3

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

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

Snowflake
SELECT * FROM
raw_table
ORDER BY id;
Copy
Résultat

ID

RAW_COLUMN

LONG_RAW_COLUMN

1

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

2

ªªªªª

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

3

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

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

Problèmes connus

Aucun problème n’a été constaté.

EWIs connexes

Pas d’EWIs connexes.

Types de données numériques

Description

Les types de données numériques de la base de données Oracle stockent des nombres à virgule fixe et flottante, positifs et négatifs, ainsi que zéro et infini, et des valeurs qui sont le résultat indéfini d’une opération « not a number » (n’est pas un nombre). NAN. (Référence linguistique Oracle Types de données numériques).

Notes sur les opérations arithmétiques

Notez que chaque opération effectuée sur des types de données numériques est stockée en interne sous la forme d’un nombre. En outre, en fonction de l’opération effectuée, il est possible d’encourir une erreur liée à la manière dont les valeurs intermédiaires sont stockées dans Snowflake. Pour plus d’informations consultez ce [post Snowflake sur les nombres internes dans Snowflake](https://community.snowflake.com/s/ question/0D50Z00008HhSHCSA3/sql-compilation-error-invalid-intermediate-datatype-number7148).

Type de données FLOAT

Description

Le type de données FLOAT est un sous-type de NUMBER. Il peut être spécifié avec ou sans précision, qui a la même définition que pourNUMBERet peut aller de 1 à 126. L’échelle ne peut pas être spécifiée mais est interprétée à partir des données. (Référence linguistique Oracle Type de données Float)

Avertissement

Notes on arithmetic operations

Notez que toute opération effectuée sur des types de données numériques est stockée en interne sous la forme d’un nombre. De plus, en fonction de l’opération effectuée, il est possible d’encourir une erreur liée à la manière dont les valeurs intermédiaires sont stockées dans Snowflake, pour plus d’informations veuillez consulter ce post Snowflake sur les nombres intermédiaires dans Snowflake.

Modèles d’échantillons de sources

Veuillez considérer la table suivante et ses encarts pour les exemples ci-dessous :

Type de données Float dans 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

Il n’y a pas de différences entre Oracle et Snowflake en ce qui concerne le type de données FLOAT sans précision.

Oracle
SELECT col1 FROM float_data_type_table;
Copy
Résultat

col1

100,55555

1,9

Snowflake
SELECT col1 FROM
float_data_type_table;
Copy
Résultat

col1

100,55555

1,9

FLOAT (p)

Les résultats des requêtes peuvent ne pas être équivalents lorsque la précision (p) est spécifiée dans le type de donnéesFLOAT. Il y a de petites différences d’arrondi.

Oracle
SELECT col2 FROM float_data_type_table;

SELECT col3 FROM float_data_type_table;
Copy
Résultat

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
Résultat

col2

1,23

7,89

12,79

123,45

col3

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

1111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Problèmes connus

1. FLOAT data type with precision

Lorsque le type de données FLOAT est précis, les résultats des requêtes peuvent présenter de légères différences d’arrondi.

EWIs connexes

Pas d’EWIs connexes.

Type de données NUMBER

Description

Le type de données NUMBER stocke le zéro ainsi que des nombres fixes positifs et négatifs ayant une valeur absolue comprise entre 1,0 x 10-130 et 1,0 x 10126. Si vous spécifiez une expression arithmétique dont la valeur a une valeur absolue supérieure ou égale à 1,0 x 10126, Oracle renvoie une erreur. Chaque valeur NUMBER nécessite de 1 à 22 octets. (Référence linguistique Oracle Type de données Number).

Le type de données NUMBER peut être spécifié en utilisant la forme suivante NUMBER(p, s) (les deux paramètres sont facultatifs) où :

  • p est la précision ou le nombre maximal de chiffres décimaux significatifs, le chiffre le plus significatif étant le chiffre non nul le plus à gauche et le chiffre le moins significatif étant le chiffre connu le plus à droite. La précision peut varier de 0 à 38.

  • s est l”échelle ou le nombre de chiffres allant de la virgule décimale au chiffre le moins significatif. L’échelle peut aller de -84 à 127.

Sous Oracle, le fait de ne pas spécifier la précision (en utilisant NUMBER ou NUMBER(*)) entraîne la création de la colonne en tant que « précision non définie ». Cela signifie qu’Oracle stocke les valeurs de manière dynamique, ce qui permet de stocker n’importe quel nombre dans cette colonne. Snowflake ne prend pas en charge cette fonctionnalité ; c’est pourquoi ils seront remplacés par NUMBER(38, 18), ce qui permettra de stocker la plus grande variété de nombres.

Avertissement

Notes on arithmetic operations

Notez que chaque opération effectuée sur des types de données numériques est stockée en interne sous la forme d’un nombre. En outre, en fonction de l’opération effectuée, il est possible d’encourir une erreur liée à la manière dont les valeurs intermédiaires sont stockées dans Snowflake. Pour plus d’informations, veuillez consulter ce [post Snowflake sur les nombres internes dans Snowflake](https://community.snowflake. com/s/question/0D50Z00008HhSHCSA3/sql-compilation-error-invalid-intermediate-datatype-number7148) ou consultez le message d’équivalence fonctionnelle SSC-FDM-0006.

Modèles d’échantillons de sources

Veuillez considérer la table suivante et ses encarts pour les exemples ci-dessous :

Nombre de types de données 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 (cas par défaut)

Lorsque la précision et l’échelle ne sont pas spécifiées, les valeurs par défaut sont les valeurs maximales disponiblesNUMBER(38, 127). La transformation actuelle pour le cas par défaut est NUMBER(38,19).

Avertissement

Dans Oracle, le fait de ne pas définir de précision ni d’échelle entraîne par défaut une « précision et une échelle non définies ». Stocke l’entrée « telle qu’elle a été reçue », ce qui signifie qu’il peut traiter à la fois des nombres entiers et des nombres à virgule flottante. Nous utilisons 38, 18 pour essayer de couvrir les deux, en utilisant 20 pour les entiers, et en laissant 18 pour les chiffres à virgule flottante.

Oracle
SELECT col1 FROM number_data_type_table;
Copy
Résultat

col1

100

Snowflake
SELECT col1 FROM
number_data_type_table;
Copy
Résultat

col1

100.0000000000000000000

NUMBER (p)

Dans ce cas, la précision spécifiera le nombre de chiffres que le nombre pourrait avoir à gauche de la virgule décimale.

Oracle
SELECT col2 FROM number_data_type_table;
Copy
Résultat

col2

2

Snowflake
SELECT col2 FROM
number_data_type_table;
Copy
Résultat

col2

2

NUMBER (p, s) p > s

Dans le cas où s est inférieur à p, la précision spécifiera le nombre de chiffres que le nombre pourrait avoir. L’échelle spécifie le nombre de chiffres significatifs à droite du point décimal, de sorte que le nombre de chiffres à gauche du point décimal dépend de l’échelle spécifiée.

Oracle
SELECT col3 FROM number_data_type_table;
Copy
Résultat

col3

12345.12345

Snowflake
SELECT col3 FROM
number_data_type_table;
Copy
Résultat

col3

12345.12345

NUMBER (p, -s)

Une échelle négative est le nombre de chiffres significatifs à gauche du point décimal, jusqu’au chiffre le moins significatif inclus. Pour l’échelle négative, le chiffre le moins significatif se trouve à gauche du point décimal, car les données réelles sont arrondies au nombre de places spécifié à gauche du point décimal. La transformation actuelle consiste à supprimer l’échelle négative.

Oracle
SELECT col4 FROM number_data_type_table;
Copy
Résultat

col4

16400

17600

Snowflake
SELECT col4 FROM
number_data_type_table;
Copy
Résultat

col4

16431

17551

NUMBER (p, s) s > p

Lorsque l’échelle est plus grande que la précision, tenez compte des aspects suivants :

  • Le nombre à insérer ne pouvait pas avoir de chiffres significatifs à gauche de la virgule décimale. Seul le zéro est disponible.

  • Le premier chiffre à droite de la virgule décimale doit être zéro.

  • La précision indique le nombre maximal de chiffres significatifs à droite du point décimal.

Oracle
SELECT col5 FROM number_data_type_table;
Copy
Résultat

col5

0.00009

0.00002

0.01268

Snowflake
SELECT col5 FROM
number_data_type_table;
Copy
Résultat

col5

0.00009

0.00002

0.01268

Problèmes connus

1. Scale value exceeds the maximum allowed by Snowflake

Lorsqu’une échelle supérieure au maximum autorisé dans Snowflake (37) est spécifiée, la valeur est remplacée par 18. Pour obtenir plus d’informations à ce sujet, consultez le site SSC-FDM-0006 documentation.

2. Negative scale

Snowflake n’autorise pas l’échelle négative, elle est donc en cours de suppression. Cela pourrait entraîner une équivalence fonctionnelle. Pour obtenir plus d’informations sur ce problème, consultez le site SSC-EWI-0R0092 documentation.

Recommandations

1. UDF for NUMBER datatype Operations

Il est possible de migrer ces opérations manuellement en utilisant l’UDF suivante lors de l’exécution d’opérations arithmétiques afin d’éviter les problèmes mentionnés :

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 connexes

  1. SSC-EWI-OR0092 L’échelle négative du type de données a été supprimée de la sortie.

  2. SSC-FDM-0006: La colonne Number Type peut ne pas se comporter de la même manière dans Snowflake.

  3. SSC-FDM-OR0010 La précision inférieure du type de données a été augmentée pour correspondre à l’échelle

Nombres à virgule flottante

Description

Les nombres à virgule flottante peuvent avoir une virgule décimale n’importe où du premier au dernier chiffre ou peuvent ne pas avoir de virgule décimale du tout. Un exposant peut éventuellement être utilisé après le nombre pour augmenter la plage, par exemple, 1,777 e-20. Une valeur d’échelle n’est pas applicable aux nombres à virgule flottante, car le nombre de chiffres pouvant apparaître après la virgule décimale n’est pas limité.Les nombres binaires à virgule flottante sont stockés à l’aide d’une précision binaire (les chiffres 0 et 1) (Référence linguistique Oracle Nombres à virgule flottante).

BINARY_DOUBLE

Description

BINARY_DOUBLE est un type de données de type nombre à virgule flottante de 64 bits, en double précision. Chaque valeur de BINARY_DOUBLE nécessite 8 octets. Dans une colonne BINARY_DOUBLE, les nombres à virgule flottante ont une précision binaire. Les nombres binaires à virgule flottante prennent en charge les valeurs spéciales infinies et NaN (pas un nombre). (Référence linguistique Oracle Type de données Binary_Double)

Il est possible de spécifier des nombres à virgule flottante dans les limites suivantes :

  • Valeur finie positive maximale = 1.79769313486231E+308

  • Valeur finie positive minimale = 2.22507485850720E-308

Modèles d’échantillons de sources

Veuillez considérer la table suivante et ses encarts pour l’exemple ci-dessous :

Double binaire dans 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

Note

« NaN » signifie _ Not a Number _, cette valeur est autorisée par le type de donnéesBINARY_DOUBLE dans Oracle et par le type de donnéesFLOATdans Snowflake.

BINARY_DOUBLE -> FLOAT

Le type de donnéesBINARY_DOUBLEn’étant pas pris en charge par Snowflake, il est converti en FLOAT.

Oracle
SELECT * FROM binary_double_data_type_table;
Copy
Résultat

col1

0

179769313486231000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

NaN

Snowflake
SELECT * FROM
binary_double_data_type_table;
Copy
Résultat

col1

0

179769313486231000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

NaN

Problèmes connus

1. The BINARY_DOUBLE data type is not supported by Snowflake

Le type de données BINARY_DOUBLE est converti en FLOAT car il n’est pas pris en charge par Snowflake.

EWIs connexes

Pas d’EWIs connexes.

BINARY_FLOAT

Description

BINARY_FLOAT est un type de données de type nombre à virgule flottante de 32 bits, à simple précision. Chaque valeurBINARY_FLOATnécessite 4 octets. Dans une colonne BINARY_FLOAT, les nombres à virgule flottante ont une précision binaire. Les nombres binaires à virgule flottante prennent en charge les valeurs spéciales infinies et NaN (pas un nombre).(Référence linguistique Oracle Type de données Binary_Float)

Il est possible de spécifier des nombres à virgule flottante dans les limites suivantes :

  • Valeur finie positive maximale = 3.40282E+38F

  • Valeur finie positive minimale = 1.17549E-38F

Modèles d’échantillons de sources

Veuillez considérer la table suivante et ses encarts pour l’exemple ci-dessous :

Float binaire dans 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

Note

« NaN » signifie _ Not a Number _, cette valeur est autorisée par le type de donnéesBINARY_FLOAT dans Oracle et par le type de donnéesFLOATdans Snowflake.

BINARY_FLOAT -> FLOAT

Le type de donnéesBINARY_FLOATn’étant pas pris en charge par Snowflake, il est converti en FLOAT.

Oracle
SELECT * FROM binary_float_data_type_table;
Copy
Résultat

col1

0

340282001837565600000000000000000000000

NaN

Snowflake
SELECT * FROM binary_float_data_type_table;
Copy
Résultat

col1

0

340282000000000000000000000000000000000

NaN

Problèmes connus

1. The BINARY_FLOAT data type is not supported by Snowflake

Le type de données BINARY_FLOAT est converti en FLOAT car il n’est pas pris en charge par Snowflake.

EWIs connexes

Pas d’EWIs connexes.

Types de données Datetime et Interval (horodatage et intervalle)

Les types de données datetime sont DATE, TIMESTAMP, TIMESTAMP WITH TIME ZONE, et TIMESTAMP WITH LOCAL TIME ZONE. Les valeurs des types de données datetime sont parfois appelées datetimes. Les types de données interval sont les suivants : INTERVAL YEAR TO MONTH et INTERVAL DAY TO SECOND. Les valeurs des types de données interval sont parfois appelées intervals. (Référence linguistique Oracle SQL Types de données Interval et Datetime (intervalle et date)).

Type de données DATE

Description

Le type de données date d’Oracle stocke à la fois les informations de date et d’heure, alors que le type de données date de Snowflake ne stocke que les informations de date. (Référence linguistique Oracle SQL Type de données Date)

La transformation par défaut pour Oracle DATE est vers Snowflake TIMESTAMP. Vous pouvez ajouter l’indicateur disableDateAsTimestamp (Interface de ligne de commande SnowConvert AI) ou désactiver le paramètre TransformDate as Timestamp (Application de bureau SnowConvert AI) afin de transformer le type DATE vers TIMESTAMP. Gardez à l’esprit que Snowflake DATE stocke uniquement les informations de date et Oracle stocke les informations de date et d’heure, si vous voulez éviter de perdre des informations, vous devriez transformer DATE vers TIMESTAMP.

Note

Différence importante de comportement d’arrondi : Lors de l’exécution d’opérations entre des types de données Date/timestamp (date/horodatage) et des intervalles impliquant des secondes, Oracle n’arrondit pas les secondes, mais préserve la précision spécifiée, tandis que Snowflake arrondit les secondes à la seconde entière la plus proche. Cette différence de comportement d’arrondi peut conduire à des résultats différents.

Modèles d’échantillons de sources

Date dans Create table

Oracle
CREATE TABLE date_table
(
	date_col date
);

INSERT INTO date_table(date_col) VALUES (DATE '2010-10-10');
Copy
Snowflake sans indicateur –disableDateAsTimestamp ou avec le paramètre « Transformer la date en horodatage » activé
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 avec l’indicateur –disableDateAsTimestamp ou avec le paramètre « Transformer la date en horodatage » désactivé
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

Récupération des données d’une colonne Date

Oracle
SELECT date_col FROM date_table;
Copy
Résultat

DATE_COL

2010-10-10 00:00:00.000

Snowflake
SELECT date_col FROM
date_table;
Copy
Résultat

DATE_COL

2010-10-10 00:00:00.000

Résultat avec indicateur disableDateAsTimestamp

DATE_COL

2010-10-10

Problèmes connus

1. Input and output format may differ between languages

Dans Snowflake, les formats d’entrée et de sortie _ DATE_ dépendent des variables de session _ DATE_INPUT_FORMAT_ et _ DATE_OUTPUT_FORMAT_. Les insertions peuvent échouer parce que DATE_INPUT_FORMAT oblige l’utilisateur à utiliser un format spécifique lorsqu’une date est ajoutée par du texte. Vous pouvez modifier ces variables en utilisant la syntaxe suivante.

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

EWIs connexes

  1. SSC-FDM-OR0042: Le type de date transformé en horodatage a un comportement différent

Type de données INTERVALDAYTOSECOND

Description

INTERVAL DAY TO SECOND stocke une période en termes de jours, d’heures, de minutes et de secondes. (Référence linguistique Oracle SQL Type de données INTERVAL DAY TO SECOND)

Il n’y a pas d’équivalent pour ce type de données dans Snowflake, il est actuellement transformé en VARCHAR.

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

Modèles d’échantillons de sources

Intervalle entre le jour et la seconde dans 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

La valeur de l’intervalle est transformée en un format Snowflake pris en charge, puis insérée sous forme de texte à l’intérieur de la colonne. Comme Snowflake ne prend pas en charge le type de données Interval, il n’est pris en charge que dans les opérations arithmétiques. Pour utiliser la valeur, il faut l’extraire et l’utiliser comme constante d’intervalle (si possible).

Valeur originale Oracle : INTERVAL « 1 2:3:4.567 » DAY TO SECOND

Valeur stockée dans la colonne Snowflake : « 1d, 2h, 3m, 4s, 567ms »

Valeur en tant que constante d’intervalle Snowflake : INTERVAL « 1d, 2h, 3m, 4s, 567ms »

Récupération des données d’une colonne Intervalle Jour à Seconde

Oracle
SELECT * FROM interval_day_to_second_table;
Copy
Résultat

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
Résultat

INTERVAL_DAY_COL1

INTERVAL_DAY_COL2

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

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

Problèmes connus

1. Only arithmetic operations are supported

Les intervalles Snowflake ont plusieurs limites. Seules les opérations arithmétiques entre DATE ou TIMESTAMP et les constantes d’intervalle sont prises en charge, tout autre scénario n’est pas pris en charge.

EWIs connexes

  1. SSC-EWI-0036: Type de données converti en autre type de données.

Type de données INTERVALYEARTOMONTH

Description

INTERVAL YEAR TO MONTH enregistre une période à l’aide des champs de date YEAR et MONTH. Il n’y a pas d’équivalent dans Snowflake, il est donc transformé en Varchar (Référence linguistique Oracle SQL Type de données INTERVAL YEAR TO MONTH)

Il n’y a pas d’équivalent pour ce type de données dans Snowflake, il est actuellement transformé en VARCHAR.

INTERVAL YEAR [(year_precision)] TO MONTH
Copy

Modèles d’échantillons de sources

Intervalle entre l’année et le mois dans 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

La valeur de l’intervalle est transformée en un format Snowflake pris en charge, puis insérée sous forme de texte à l’intérieur de la colonne. Comme Snowflake ne prend pas en charge le type de données Interval, il n’est pris en charge que dans les opérations arithmétiques. Pour utiliser la valeur, il faut l’extraire et l’utiliser comme constante d’intervalle (si possible).

Valeur originale Oracle : INTERVAL « 1-2 » YEAR TO MONTH

Valeur stockée dans la colonne Snowflake : « 1y, 2m »

Valeur en tant que constante d’intervalle Snowflake : INTERVAL « 1y, 2m »

Récupération des données d’une colonne Intervalle année-mois

Oracle
SELECT * FROM interval_year_to_month_table;
Copy
Résultat

INTERVAL_YEAR_COL1

INTERVAL_YEAR_COL2

1-2

1000-11

Snowflake
SELECT * FROM
interval_year_to_month_table;
Copy
Résultat

INTERVAL_YEAR_COL1

INTERVAL_YEAR_COL2

1y, 2m

              |1000y, 11m        |
Copy

Problèmes connus

1. Only arithmetic operations are supported

Les intervalles Snowflake ont plusieurs limites. Seules les opérations arithmétiques entre DATE ou TIMESTAMP et les constantes d’intervalle sont prises en charge, tout autre scénario n’est pas pris en charge.

EWIs connexes

  • SSC-EWI-0036: Type de données converti en autre type de données.

Type de données TIMESTAMP

Description

Le type de données TIMESTAMP est une extension du type de données DATE. Il stocke l’année, le mois et le jour du type de données DATE, ainsi que les valeurs de l’heure, de la minute et de la seconde. (Référence linguistique Oracle SQL Type de données Horodatage)

Les types de données Oracle et Snowflake TIMESTAMP ont la même plage de précision (0-9) mais des valeurs par défaut différentes. Dans Oracle, la valeur par défaut de la précision est de 6 et dans Snowflake de 9.

Il existe toutefois une différence de comportement lorsqu’une valeur insérée dépasse la précision de l’ensemble. Oracle arrondit les décimales supérieures, tandis que Snowflake se contente de rogner les valeurs.

TIMESTAMP [(fractional_seconds_precision)] 
Copy

Modèles d’échantillons de sources

Horodatage dans 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

Récupération des données d’une colonne Horodatage

Oracle
SELECT * FROM timestamp_table;
Copy
Résultat

TIMESTAMP_COL1

TIMESTAMP_COL2

2010-10-10 12:00:00.000

2010-10-10 12:00:00.000

Snowflake
SELECT * FROM
timestamp_table;
Copy
Résultat

TIMESTAMP_COL1

TIMESTAMP_COL2

2010-10-10 12:00:00.000

2010-10-10 12:00:00.000

Problèmes connus

Aucun problème n’a été constaté.

EWIs connexes

Pas d’EWIs connexes.

Type de données TIMESTAMPWITHLOCALTIMEZONE

Description

Diffère de TIMESTAMP WITH TIME ZONE dans la mesure où les données stockées dans la base de données sont normalisées en fonction du fuseau horaire de la base de données et où les informations relatives au fuseau horaire ne sont pas stockées dans les données de la colonne.(Oracle SQL Language Reference Timestamp with Local Time Zone Data Type)

L’équivalent Snowflake est TIMESTAMP_LTZ.

Pour plus d’informations, consultez également la section TIMESTAMP.

TIMESTAMP [(fractional_seconds_precision)] WITH LOCAL TIME ZONE

Copy

Modèles d’échantillons de sources

Horodatage avec fuseau horaire dans 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

Récupération des données d’une colonne Horodatage avec la colonne Fuseau horaire local

Oracle
SELECT * FROM timestamp_with_local_time_zone_table;
Copy
Résultat

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
Résultat

TIMESTAMP_COL1

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

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

Note

Notez que les jeux résultats sont différents dans les deux moteurs car chaque base de données est définie avec un fuseau horaire différent. Le fuseau horaire d’Oracle est « +00:00 » et celui de Snowflake est « America/Los\Angeles ».

Utilisez la syntaxe suivante pour modifier le fuseau horaire par défaut de la base de données :

ALTER account SET timezone = timezone_string;
Copy

Problèmes connus

1. Default database timezone

Les opérations effectuées avec ce type de données sont affectées par le fuseau horaire de la base de données et les résultats peuvent être différents. Vous pouvez vérifier le fuseau horaire par défaut à l’aide des requêtes suivantes :

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

Lors de l’opération d’horodatages avec des types de données de fuseau horaire local, Oracle convertit les horodatages dans le fuseau horaire par défaut de la base de données. Pour reproduire ce comportement dans Snowflake, le paramètre de session TIMESTAMP_TYPE_MAPPING doit être défini sur « TIMESTAMP_LTZ ».

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

Snow Convert n’effectue aucune conversion pour les chaînes de format date/horodatage, il peut donc y avoir des erreurs lors du déploiement du code. Exemple :

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

Avertissement

La requête échouera dans Snowflake car le format d’entrée de l’horodatage par défaut ne reconnaît pas « -8:00 » comme un décalage valide UTC. Il doit être remplacé par « 0800 » ou « -08:00 » pour obtenir le même résultat.

EWIs connexes

Pas d’EWIs connexes.

Type de données TIMESTAMPWITHTIMEZONE

Description

TIMESTAMP WITH TIME ZONE est une variante de TIMESTAMP qui inclut dans sa valeur un nom de région de fuseau horaire ou un décalage de fuseau horaire. L’équivalent dans Snowflake est TIMESTAMP_TZ.(Oracle SQL Language Reference Timestamp with Time Zone Data Type)

L’équivalent Snowflake est TIMESTAMP_TZ.

Pour plus d’informations, consultez également la section TIMESTAMP.

TIMESTAMP [(fractional_seconds_precision)] WITH TIME ZONE

Copy

Modèles d’échantillons de sources

Horodatage avec fuseau horaire dans 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

Récupération des données d’une colonne Horodatage avec colonne Fuseau horaire

Oracle
SELECT * FROM timestamp_with_time_zone_table;
Copy
Résultat

TIMESTAMP_COL1

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

Snowflake
SELECT * FROM
timestamp_with_time_zone_table;
Copy
Résultat

TIMESTAMP_COL1

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

Note

Notez que le fuseau horaire est différent dans les deux moteurs car lorsque le fuseau horaire n’est pas spécifié, le fuseau horaire par défaut de la base de données est ajouté.

Utilisez la syntaxe suivante pour modifier le fuseau horaire par défaut de la base de données :

ALTER account SET sqtimezone = timezone_string;
Copy

Problèmes connus

1. Timestamp formats may be different

Snow Convert n’effectue aucune conversion pour les chaînes de format date/horodatage, il peut donc y avoir des erreurs lors du déploiement du code. Exemple :

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

Avertissement

La requête échouera dans Snowflake car le format d’entrée de l’horodatage par défaut ne reconnaît pas « -8:00 » comme un décalage valide UTC. Il doit être remplacé par « -0800 » ou « -08:00 » pour obtenir le même résultat.

EWIs connexes

Pas d’EWIs connexes.

Arithmétique de DateTime (horodatage)

Ce contenu explique la transformation actuelle pour certaines opérations arithmétiques entre les types DateTime (horodatage).

Description

Dans Oracle, certaines opérations arithmétiques pouvaient être effectuées entre les types DateTime, comme l’addition, la soustraction, la multiplication et la division. Actuellement, SnowConvert AI peut résoudre certains cas d’addition et de soustraction. Ces cas sont expliqués ci-dessous.

Modèles d’échantillons de sources

Ceci est un résumé de la transformation actuelle pour les différentes combinaisons des opérations d’addition et de soustraction avec des types date, horodatage, nombre et inconnus.

Note

Considérez le tableau suivant pour les exemples ci-dessous.

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

Ajout

Matrice de combinaison

Ceci est un résumé de la façon dont l’outil de migration résout les opérations d’ajout pour les différentes combinaisons avec les typesdate, horodatage, nombre et inconnus.

Ajout

Date

Horodatage

Nombre

Intervalle

Inconnu

Float

Date

INVALID

INVALID

Date + jour de l’intervalle

Date + intervalle IntervalUnit

DATEADD_UDF

DATEADD_UDF

Horodatage

INVALID

INVALID

Horodatage + jour d’intervalle

Horodatage + Intervalle IntervalUnit

DATEADD_UDF

DATEADD_UDF

Nombre

Date + jour de l’intervalle

Horodatage + jour d’intervalle

Nombre + Nombre

INVALID

SSC-EWI-OR0036

Nombre + Flottant

Intervalle

Date + intervalle IntervalUnit

Horodatage + Intervalle IntervalUnit

INVALID

SSC-EWI-OR0036

Inconnu + Intervalle IntervalUnit

INVALID

Inconnu

DATEADD_UDF

DATEADD_UDF

Inconnu + Nombre

Inconnu + Intervalle IntervalUnit

SSC-EWI-OR0036

SSC-EWI-OR0036

Flottant

DATEADD_UDF

DATEADD_UDF

Flottant + Nombre

INVALID

SSC-EWI-OR0036

Flottant + Flottant

Note

Une colonne de type inconnu est le résultat de l’incapacité de l’outil de migration à établir le type de données que la colonne contient. Cela peut se produire pour de nombreuses raisons, par exemple l’absence de DDLs pour les tables exploitées, les colonnes résultant des opérations sur les vues, CTES sous-requêtes ou, etc.

Avertissement

Par défaut, Snow Convert migre les opérations de type Date/Timestamp + Interval vers les opérations natives de Snowflake, mais dans certains cas, il peut être utile d’utiliser UDF à la place. Vous trouverez plus d’informations sur cette UDF ici.

Les différents chemins que l’outil de migration peut utiliser pour résoudre les opérations d’ajout seront expliqués ci-dessous :

Non valide

Certaines combinaisons ne sont pas valides pour effectuer des opérations d’ajout dans Oracle :

Oracle
SELECT AsDate + AsDateTwo From TIMES;

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

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

Copy

Date + jour de l’intervalle

Il s’agit de la transformation actuelle de l’opération d’addition entre un type de date et un nombre (et vice versa). Par exemple :

Oracle
SELECT AsDate + 1 FROM TIMES;

SELECT 1 + AsDate FROM TIMES;
Copy
Résultat

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
Résultat

ASDATE + INTERVAL “1 DAY”

2021-11-07

Horodatage + jour d’intervalle

Il s’agit de la transformation actuelle de l’opération d’addition entre un type d’horodatage et un nombre (et vice versa). Par exemple :

Oracle
SELECT AsTimestamp + 1 FROM TIMES;

SELECT 1 + AsTimestamp FROM TIMES;
Copy
Résultat

ASTIMESTAMP+1

2021-11-06 11:00:00.000

1+ASTIMESTAMP

2021-11-06 11:00:00.000

Note

Remarque : Dans Oracle, les colonnes DATE et TIMESTAMP contiennent une composante temporelle, mais Oracle a utilisé le masque de format spécifié par Le paramètre NLS_DATE_FORMAT pour décider comment convertir implicitement la date en chaîne, c’est pourquoi lors de l’exécution de certaines opérations entre TIMESTAMP et des intervalles, le résultat pourrait être affiché comme DATE, masquant la composante temporelle, à moins que le paramètre NLS_DATE_FORMAT soit modifié.

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
Résultat

ASTIMESTAMP + INTERVAL “1 DAY”

2021-11-06 11:00:00.000

DATEADD_UDF

Pour les cas où il y a une opération d’addition entre un type de date ou d’horodatage et un type inconnu, une fonction définie par l’utilisateur (UDF) est ajouté. Vous trouverez les informations d’implémentation de l’UDF ici. L’UDF se trouve dans le dossier UDFs. Par exemple :

Note

Pour les exemples suivants, une sous-requête sera utilisée, en essayant de simuler la colonne de type inconnu.

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

SELECT AsTimestamp + (SELECT EXTRACT(DAY FROM AsTimestampTwo) FROM TIMES) FROM TIMES;
Copy
Résultat

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
Résultat

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

Soustraction

Matrice de combinaison

Soustraction

Date

Horodatage

Nombre

Intervalle

Inconnu

Float

Date

DATEDIFF

TIMESTAMP_DIFF___UDF

Date - Jour de l’intervalle

Date - Intervalle IntervalUnit

DATEDIFF_UDF

DATEDIFF_UDF

Horodatage

TIMESTAMP_DIFF___UDF

TIMESTAMP_DIFF___UDF

Horodatage - Jour de l’intervalle

Horodatage - Intervalle IntervalUnit

DATEDIFF_UDF

DATEDIFF_UDF

Nombre

INVALID

INVALID

Nombre - Nombre

INVALID

SSC-EWI-OR0036

Nombre - Flottant

Intervalle

INVALID

INVALID

INVALID

SSC-EWI-OR0036

Inconnu - Intervalle IntervalUnit

NOT SUPPORTED IN ORACLE

Inconnu

DATEDIFF_UDF

DATEDIFF_UDF

SSC-EWI-OR0036

Inconnu - Intervalle IntervalUnit

SSC-EWI-OR0036

SSC-EWI-OR0036

Flottant

DATEDIFF_UDF

DATEDIFF_UDF

Flottant - Nombre

NOT SUPPORTED IN ORACLE

SSC-EWI-OR0036

Flottant - Flottant

Note

Une colonne de type inconnu est le résultat de l’incapacité de l’outil de migration à établir le type de données que la colonne contient. Cela peut se produire pour de nombreuses raisons, par exemple l’absence de DDLs pour les tables exploitées, les colonnes résultant des opérations sur les vues, CTES sous-requêtes ou, etc.

Avertissement

Par défaut, Snow Convert migre les opérations de type Date/Timestamp + Interval vers les opérations natives de Snowflake, mais dans certains cas, il peut être utile d’utiliser UDF à la place. Vous trouverez plus d’informations sur cette UDF ici.

Les différents chemins que l’outil de migration peut utiliser pour résoudre les opérations de soustraction seront expliqués ci-dessous :

Non valide

Certaines combinaisons ne sont pas valides pour effectuer des opérations de soustraction dans Oracle :

Oracle
SELECT 1 - AsDate FROM TIMES;

SELECT 1 - AsTimestamp FROM TIMES;
Copy
Résultat
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

La soustraction entre deux opérandes de type date est convertie en fonction Snowflake DATEDIFF, utilisant ’jour’ comme unité de temps (premier paramètre). Par exemple :

Oracle
SELECT AsDate - AsDateTwo FROM TIMES;
Copy
Résultat

ASDATE-ASDATETWO

1

Snowflake
SELECT AsDate - AsDateTwo FROM
TIMES;
Copy
Résultat

DATEDIFF(DAY, ASDATETWO, ASDATE)

1

Date - Jour de l’intervalle

Il s’agit de la transformation actuelle de l’opération de soustraction entre un type date et un type nombre. Par exemple :

Oracle
SELECT AsDate - 1 FROM TIMES;

SELECT AsDate + -1 FROM TIMES;
Copy
Résultat

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
Résultat

ASDATE - INTERVAL “1 DAY”

2021-11-05

ASDATE + INTERVAL “-1 DAY”

2021-11-05

Horodatage - Jour de l’intervalle

Il s’agit de la transformation actuelle pour l’opération d’addition entre un type horodatage et un type nombre. Par exemple :

Oracle
SELECT AsTimestamp - 1 FROM TIMES;

SELECT AsTimestamp + -1 FROM TIMES;
Copy
Résultat

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
Résultat

ASTIMESTAMP - INTERVAL “1 DAY”

2021-11-04 11:00:00.000

ASTIMESTAMP + INTERVAL “-1 DAY”

2021-11-04 11:00:00.000

Note

Remarque : Dans Oracle, les colonnes DATE et TIMESTAMP contiennent une composante temporelle, mais Oracle utilise le masque de format spécifié par le paramètre NLS_DATE_FORMAT pour décider comment convertir implicitement la date en chaîne, c’est pourquoi lors de l’exécution de certaines opérations entre TIMESTAMP et les Intervalles, le résultat pourrait être affiché comme DATE, masquant la composante temporelle, à moins que le paramètre NLS_DATE_FORMAT soit modifié.

Vous trouverez plus d’informations sur le format NLS_DATE_FORMAT ici.

TIMESTAMP_DIFF_UDF

Les soustractions entre les types horodatage et dates avec un horodatage et vice versa sont résolues en insérant la fonction définie par l’utilisateur TIMESTAMP_DIFF_UDF, (l’implémentation se trouve ici). Par exemple :

Oracle
SELECT AsTimeStamp - AsTimeStampTwo FROM TIMES;

SELECT AsTimeStamp - AsDateTwo FROM TIMES;

SELECT AsDateTwo - AsTimeStamp FROM TIMES;
Copy
Résultat

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
Résultat

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

Pour les cas où il y a une opération d’addition entre un type de date ou d’horodatage et un type inconnu, une fonction définie par l’utilisateur (UDF) est ajouté. L’implémentation de l’UDF se trouve ici, mais elle peut être modifiée pour exécuter ce qui est requis. L’UDF se trouve dans le dossier UDFs. Par exemple :

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

SELECT ASTIMESTAMP - (EXTRACT(DAY FROM ASDATE)) FROM TIMES;
Copy
Résultat

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
Résultat

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

Cas courants

Avertissement : SSC-EWI-OR0036

Cet avertissement est utilisé pour indiquer si une opération d’addition ou de soustraction peut ne pas se comporter correctement en raison des types de données des opérandes. Cela signifie que le résultat de l’opération dans Snowflake n’est pas fonctionnellement équivalent à Oracle. L’addition et la soustraction entre une date ou un type numérique et un type inconnu sont l’un des cas les plus courants. Par exemple :

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

Cet EWI est ajouté dans les opérations où le type de colonne ne pouvait pas être résolu, si le type de colonne est INTERVAL et n’est utilisé qu’avec d’autres intervalles, l’EWI sera ajouté mais le code ne sera pas commenté. L’exemple suivant décrit ce comportement :

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

Problèmes connus

1. TIMESTAMP DIFF UDF improvement

TIMESTAMP_DIFF_UDF doit être amélioré pour pouvoir spécifier le type de retour. Cela signifie l’ajout d’un troisième paramètre dans lequel il est possible de spécifier la partie de temps, par exemple, le jour, l’heure, le mois, etc.

2. Built-in functions as operators

Il n’existe actuellement aucune gestion des opérations de date entre les fonctions intégrées qui renvoient des types de date.

3. Multiple operands

Actuellement, il n’y a pas de gestion pour l’opération de date avec plus de deux opérandes, cela peut fonctionner mais vous pouvez aussi trouver des problèmes.

4. Comparison operators

Actuellement, il n’existe pas de gestion des opérations de date avec des opérateurs de comparaison tels que supérieur à, inférieur à, etc.

5. Output format

Le format de résultat des opérations arithmétiques peut être modifié via la commande suivante ALTER SESSION SET DATE_OUTPUT_FORMAT = 'DESIRED-FORMAT' ; dans Snowflake

6 Problèmes dans les opérations d’intervalle avec une précision de l’ordre de la seconde

Certaines opérations peuvent varier en termes de précision, en particulier celles qui incluent des intervalles avec une précision en secondes. En effet, les arrondis d’Oracle dépendent de la précision. L’intervalle de Snowflake ne prend pas en charge les secondes avec des décimales. Pour obtenir le même résultat, il est nécessaire de modifier la deuxième décimale par millisecondes dans les intervalles en tenant compte de l’arrondi effectué par Oracle. L’exemple suivant le problème :

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

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

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
Résultat

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 connexes

  1. SSC-EWI-0108: La sous-requête suivante correspond à au moins l’un des modèles considérés comme non valides et peut générer des erreurs de compilation.

  2. SSC-EWI-OR0036: Problèmes de résolution des types, l’opération arithmétique peut ne pas se comporter correctement entre la chaîne et la date.

UDFs d’intervalle vs opération d’intervalle native de Snowflake

Description

Le tableau suivant montre une comparaison entre DATEADD_UDF INTERVAL et DATEDIFF_UDF INTERVAL vs l”[opération native Snowflake](https://docs.snowflake.com/fr/sql-reference/data-types-datetime. html#interval-constants) pour le calcul d’intervalle.

Code nécessaire

Pour exécuter les requêtes de la table comparative, il est nécessaire d’exécuter le code suivant :

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

Table de comparaison

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 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

Résultats

Oracle

Opération 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

Problèmes connus

Aucun problème n’a été constaté.

EWIs connexes

  1. SSC-FDM-OR0042: Le type de date transformé en horodatage a un comportement différent

Types de données PL SQL

Type de données BINARY_INTEGER

Ce type de données est identique au type de données PLS_INTEGER.

Type de données PLS_INTEGER

Description

Le type de données PLS_INTEGER stocke des entiers signés compris entre -2 147 483 648 et 2 147 483 647, représentés sur 32 bits. (Référence linguistique Oracle Type de données PLS_INTEGER)

Le type de données PLS_INTEGER est transformé en NUMBER. Cette transformation s’applique également à chaque sous-type de PLS_INTEGER :

  • NATURAL

  • NATURALN

  • POSITIVE

  • POSITIVEN

  • SIGNTYPE

  • SIMPLE_INTEGER

Avertissement

Certains de ces sous-types ne sont actuellement pas reconnus par SnowConvert AI de sorte qu’ils sont convertis en VARIANT et considérés comme types définis par l’utilisateur. Il existe déjà un élément de travail pour résoudre le problème.

Modèles d’échantillons de sources

Veuillez considérer la table suivante et ses encarts pour les exemples ci-dessous :

Code

CREATE TABLE PLS_INTEGER_TABLE(
	COL NUMBER
);
Copy

Utilisation de PLS_INTEGER dans les blocs de procédure

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
Résultat

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
Résultat

COL

2147483647

2147483648

2147483649

Problèmes connus

1. Storage and performance features were not preserved

Oracle PLS_INTEGER présente certains avantages en termes de taille de stockage et de performance dans les opérations arithmétiques. Ces fonctions n’ont pas été émulées parce que Snowflake NUMBER ne les possède pas. Pour plus d’informations, consultez la documentation PLS_INTEGER.

EWIs connexes

Pas d’EWIs connexes.

Données de type caractères

Les données de type caractères stockent des données de caractères (alphanumériques), qui sont des mots et du texte libre, dans le jeu de caractères de base de données ou le jeu de caractères nationaux. (Référence linguistique Oracle SQL - Types de données caractères).

Type de données CHAR

Description

Le type de données CHAR spécifie une chaîne de caractères de longueur fixe ****dans l’ensemble de caractères de la base de données. (Référence linguistique Oracle SQL Type de données CHAR)

Comme indiqué dans la documentation Oracle, la taille dans le type de données CHAR est une contrainte de longueur et ne doit pas être confondue avec la capacité. Le nombre total de caractères pouvant être stockés dans CHAR peut varier en fonction de l’ensemble de caractères et de la configuration de la base de données, mais la taille maximale autorisée est généralement de 2 000.

Dans Snowflake, les types CHAR sont synonymes de VARCHAR, et comme vous pouvez le vérifier ici :

Référence linguistique Snowflake SQL types de données de texte de référence

La taille maximale standard est beaucoup plus importante. Mais cela ne signifie pas qu’un VARCHAR Snowflake consommera plus de stockage, comme le mentionne leur documentation :

Une chaîne de 1 caractère dans une colonne VARCHAR(16777216) ne consomme qu’un seul caractère.

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

Modèles d’échantillons de sources

Types de données Char dans 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

Récupération des données dans des colonnes Char

Oracle
SELECT * FROM char_data_types;
Copy
Résultat

CHAR_COLUMN1

CHAR_COLUMN2

CHAR_COLUMN3

CHAR_COLUMN4

H

Hello world

Hello world

Hello world

Snowflake
SELECT * FROM
char_data_types;
Copy
Résultat

CHAR_COLUMN1

CHAR_COLUMN2

CHAR_COLUMN3

CHAR_COLUMN4

H

Hello world

Hello world

Hello world

Note

Dans Oracle, la valeur est remplie d’espaces vides pour s’adapter à la taille fixe déterminée dans la définition de la colonne. En revanche, Snowflake utilise une taille dynamique (en conservant la restriction de longueur) pour stocker la valeur.

Vérification des types de données internes pour CHAR

Comme mentionné au début, Snowflake utilise en interne un VARCHAR pour les colonnes de type CHAR, nous pouvons le confirmer en décrivant les tables :

Oracle

<../../../../../../images/migrations/sc-assets/image(106)(1).png>

Snowflake

<../../../../../../images/migrations/sc-assets/image(198)(1).png>

Note

La restriction de longueur est préservée, mais la mémoire utilisée par les colonnes est différente sur chaque DBMS.

Récupération de la taille en octets de chaque colonne :

Oracle
SELECT 
LENGTHB(char_column1),
LENGTHB(char_column2),
LENGTHB(char_column3),
LENGTHB(char_column4)  
FROM char_data_types;
Copy
Résultat

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
Résultat

OCTET_LENGTH(CHAR_COLUMN1)

OCTET_LENGTH(CHAR_COLUMN2)

OCTET_LENGTH(CHAR_COLUMN3)

OCTET_LENGTH(CHAR_COLUMN4)

1

11

11

11

Remarque

Outre ces légères différences, l’intégration des données est préservée.

Problèmes connus

1. Les résultats obtenus à partir de certaines fonctions intégrées peuvent varier

Comme expliqué dans la section précédente, il peut arriver que l’utilisation de fonctions intégrées sur les colonnes permette de récupérer des résultats différents. Par exemple, obtenir la longueur d’une colonne.

EWIs connexes

  1. SSC-FDM-OR0015: LENGTHB transformed to OCTET_LENGTH.

Type de données NCHAR

Description

Le type de données NCHAR spécifie une chaîne de caractères de longueur fixe dans l’ensemble des caractères nationaux. (Référence linguistique Oracle SQL NCHAR)

NCHAR permet de stocker des caractères spéciaux avec leur Unicode afin qu’ils soient préservés à travers toute utilisation, ces caractères spéciaux peuvent nécessiter plus de bits pour être stockés et c’est pourquoi, par défaut, l’ensemble de caractères NCHAR est AL16UTF16, contrairement à l’ensemble de données de caractères communs pour CHAR qui est généralement AL32UTF8.

NCHAR est conservé sous la forme NCHAR dans Snowflake, mais, en arrière-plan, Snowflake utilise VARCHAR. Les informations de transformation relatives à CHAR sont également valables pour NCHAR.

NCHAR [ (size) ]

Copy

Modèles d’échantillons de sources

Types de données Nchar dans 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

Note

Dans Oracle, si vous essayez d’insérer ces valeurs dans une colonne CHAR de même taille, vous obtiendrez une erreur : valeur trop grande pour la colonne.

Récupération des informations dans des colonnes Nchar

Oracle
SELECT * FROM nchar_data_types;
Copy
Résultat

NCHAR_COLUMN1

NCHAR_COLUMN2

ភាសាខ

Snowflake
SELECT * FROM
nchar_data_types;
Copy
Résultat

NCHAR_COLUMN1

NCHAR_COLUMN2

ភាសាខ

Récupération de la taille en octets de chaque colonne

Oracle
SELECT 
LENGTHB(nchar_column1),
LENGTHB(nchar_column2)
FROM nchar_data_types;
Copy
Résultat

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
Résultat

OCTET_LENGTH(NCHAR_COLUMN1)

OCTET_LENGTH(NCHAR_COLUMN2)

                      3|                         15|
Copy

Notez que le nombre spécifié dans la déclaration de la colonne est la taille en caractères et non en octets, c’est pourquoi nous voyons plus d’espace utilisé pour stocker ces caractères spéciaux.

Note

Dans Snowflake, VARCHAR utilise UTF-8, la taille peut varier en fonction du caractère Unicode qui peut être représenté en 1, 2, 3 ou 4 octets. Dans ce cas, le caractère cambodgien utilise 3 octets pour être stocké.

Remarque

Outre ces légères différences, l’intégration des données est préservée.

Problèmes connus

1. Les résultats obtenus à partir de certaines fonctions intégrées peuvent varier

Comme expliqué dans la section précédente, il peut arriver que l’utilisation de fonctions intégrées sur les colonnes permette de récupérer des résultats différents. Par exemple, obtenir la longueur d’une colonne.

EWIs connexes

  1. SSC-FDM-OR0015: LENGTHB transformed to OCTET_LENGTH.

Type de données NVARCHAR2

Description

Le type de données NVARCHAR2 spécifie une chaîne de caractères de longueur variable dans l’ensemble des caractères nationaux. (Référence linguistique Oracle SQL NVARCHAR2)

NVARCHAR2 (size)

Copy

NVARCHAR2 permet de stocker des caractères spéciaux avec leur Unicode afin qu’ils soient préservés à travers toute utilisation, ces caractères spéciaux peuvent nécessiter plus de bits pour être stockés et c’est pourquoi, par défaut, l’ensemble de caractères NVARCHAR2 est AL16UTF16, contrairement à l’ensemble de données de caractères communs pour VARCHAR2 qui est généralement AL32UTF8.

NVARCHAR transformé en Snowflake VARCHAR, Informations sur la transformation relatives à VARCHAR2, est également valide pour NVARCHAR2.

NVARCHAR2 (size)

Copy

Modèles d’échantillons de sources

Type de données Nvarchar2 dans 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

Note

Dans Oracle, si vous essayez d’insérer ces valeurs dans une colonne VARCHAR2 de même taille, vous obtiendrez une erreur : valeur trop grande pour la colonne.

Récupération des informations dans des colonnes Nchar

Oracle
SELECT * FROM nvarchar2_data_types;
Copy
Résultat

NVARCHAR2_COLUMN

ភាសាខ

Snowflake
SELECT * FROM
nvarchar2_data_types;
Copy
Résultat

NVARCHAR2_COLUMN

ភាសាខ

Récupération de la taille en octets de chaque colonne

Oracle
SELECT 
LENGTHB(nvarchar2_column)
FROM nvarchar2_data_types;
Copy
Résultat

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
Résultat

OCTET_LENGTH(NVARCHAR2_COLUMN)

15

Notez que le nombre spécifié dans la déclaration de la colonne est la taille en caractères et non en octets, c’est pourquoi nous voyons plus d’espace utilisé pour stocker ces caractères spéciaux.

Note

Dans Snowflake, VARCHAR utilise UTF-8, la taille peut varier en fonction du caractère Unicode qui peut être représenté en 1, 2, 3 ou 4 octets. Dans ce cas, les caractères cambodgiens utilisent 3 octets pour être stockés.

Remarque

Outre ces légères différences, l’intégration des données est préservée.

Problèmes connus

1. Les résultats obtenus à partir de certaines fonctions intégrées peuvent varier

Comme expliqué dans la section précédente, il peut arriver que l’utilisation de fonctions intégrées sur les colonnes permette de récupérer des résultats différents. Par exemple, obtenir la longueur d’une colonne.

EWIs connexes

  1. SSC-FDM-OR0015: LENGTHB transformed to OCTET_LENGTH.

Type de données VARCHAR

Description

Oracle recommande d’utiliser VARCHAR2 au lieu de VARCHAR, comme expliqué dans sa documentation :

Référence linguistique Oracle SQL Varchar

Même si, la syntaxe est analysée et transformée à l’aide des types de donnéesANSI, DB2 et SQL/DS.

Type de données VARCHAR2

Description

Le type de données VARCHAR2 spécifie une chaîne de caractères de longueur variable dans l’ensemble des caractères de la base de données. (Référence linguistique Oracle SQL VARCHAR2)

Comme indiqué dans la documentation Oracle, la taille dans le type de données VARCHAR2 est une contrainte de longueur et ne doit pas être confondue avec la capacité. Le nombre total de caractères pouvant être stockés dans VARCHAR2 peut varier en fonction de l’ensemble de caractères et de la configuration de la base de données, mais la taille maximale autorisée est généralement de 4 000.

VARCHAR2 est traduit en Snowflake VARCHAR qui peut stocker un plus grand nombre d’octets/de caractères par défaut. Dans les deux cas, la mémoire utilisée est variable en fonction de la taille de la valeur stockée dans la colonne, comme dans Oracle.

VARCHAR2 (size [ BYTE | CHAR ])
Copy

Modèles d’échantillons de sources

Types de données Varchar2 dans 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

Récupération des données dans des colonnes varchar

Oracle
SELECT * FROM varchar2_data_types;
Copy
Résultat

VARCHAR2_COLUMN1

VARCHAR2_COLUMN2

VARCHAR2_COLUMN3

H

Bonjour

Hell

Snowflake
SELECT * FROM
varchar2_data_types;
Copy
Résultat

VARCHAR2_COLUMN1

VARCHAR2_COLUMN2

VARCHAR2_COLUMN3

H

Bonjour

Hell

Révision de la taille des variables dans les colonnes

Oracle
SELECT
LENGTHB(varchar2_column1),
LENGTHB(varchar2_column2),
LENGTHB(varchar2_column3) 
FROM VARCHAR2_DATA_TYPES;
Copy
Résultat

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
Résultat

OCTET_LENGTH(VARCHAR2_COLUMN1)

OCTET_LENGTH(VARCHAR2_COLUMN2)

OCTET_LENGTH(VARCHAR2_COLUMN3)

1

5

4

Problèmes connus

Aucun problème n’a été constaté.

EWIs connexes

  1. SSC-FDM-OR0015: LENGTHB transformed to OCTET_LENGTH.

Types de données LOB

Description

Les types de données LOB BLOB, CLOB intégrés et NCLOB (stocké en interne) et BFILE (stocké en externe) peut stocker des données volumineuses et non structurées telles que du texte, des images, des vidéos et des données spatiales. (Référence linguistique Oracle SQL Type de données LOB).

BFILE
BLOB
CLOB
NCLOB
Copy

Avertissement

Les types de données LOB ne sont pas pris en charge dans Snowflake. Conformément à la documentation de Snowflake, il est recommandé de transformer CLOB vers VARCHAR, et BLOB vers BINARY, cependant, il existe plusieurs limitations. {% endhint %}

Avertissement

Les propriétés LOB des tables ne sont également pas prises en charge dans Snowflake. {% endhint %}

Type de données BFILE

Description

Contient un emplacement vers un grand fichier binaire stocké en dehors de la base de données. Permet l’accès E/S par flux d’octets aux bases de données externes LOBs résidant sur le serveur de base de données. Une colonne ou un attribut BFILE stocke un emplacement BFILE, qui sert de pointeur vers un fichier binaire sur le système de fichiers du serveur. L’emplacement conserve le nom du répertoire et le nom du fichier. (Référence linguistique Oracle SQL Type de données BFILE).

Avertissement

Le type de données BFILE n’est pas pris en charge dans Snowflake. VARCHAR est utilisé à la place.

Modèles d’échantillons de sources

Type de données Bfile dans Create table

Avertissement

Les colonnes Oracle BFILE sont utilisées pour stocker un emplacement avec le répertoire et le nom du fichier. Ils sont transformés en VARCHAR Snowflake afin de stocker le répertoire et le nom du fichier dans la colonne. Toutefois, le chargement du contenu du fichier doit être effectué manuellement.

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
Résultat

COL1

[BFILE:monfichier.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
Résultat

COL1

monrépertoire\monfichier.png

Avertissement

UDF ajoutée pour remplacer BFILENAME().

UDF ajoutée

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

Problèmes connus

1. No access to the DBMS_LOB built-in package

Les types de données LOB n’étant pas pris en charge par Snowflake, il n’y a pas d’équivalent pour les fonctions DBMS_LOB et il n’existe pas encore de solution de contournement.

EWIs connexes

  1. SSC-EWI-OR0105: Un travail supplémentaire est nécessaire pour l’utilisation de la colonne BFILE. La fonction BUILD_STAGE_URL est une solution de contournement recommandée.

Type de données BLOB

Description

Le type de données BLOB stocke de grands objets binaires non structurés. Les objets BLOB peuvent être considérés comme des flux de bits sans sémantique d’ensemble de caractères. (Référence linguistique Oracle SQL Type de données BLOB).

Avertissement

Le type de données BLOB n’est pas pris en charge dans Snowflake. BINARY est utilisé à la place.

Modèles d’échantillons de sources

BLOB dans 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

Récupération des données

Oracle
SELECT * FROM blobtable;
Copy
Résultat

BLOB_COLUMN

EMPTY_COLUMN

[NULL]

[BLOB]

Snowflake
SELECT * FROM
blobtable;
Copy
Résultat

BLOB_COLUMN

EMPTY_COLUMN

NULL

Exemple fonctionnel

Avertissement

Cet exemple n’est pas une traduction de SnowConvert AI, il n’est utilisé que pour montrer l’équivalence fonctionnelle entre Oracle BLOB et Snowflake BINARY

Avertissement

Nous utilisons les fonctions « utl_raw.cast_to_raw » et « DBMS_LOB.SUBSTR ». La conversion de ces fonctions n’est pas prise en charge actuellement par 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
Résultat

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
Résultat

RESULT

[NULL]

Hello world

Problèmes connus

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

La taille maximale d’une colonne Oracle BLOB est (4 gigaoctets - 1) * (taille du bloc de la base de données) , mais la taille de la colonne Snowflake BINARY est limitée à 8MB.

2. Empty value with EMPTY_BLOB

L’initialisation d’une colonne à l’aide de EMPTY_BLOB() renverra un emplacement LOB vide. Alors qu’après la traduction, la colonne renverra une chaîne avec «   ».

3. No access to the DBMS_LOB built-in package

Les types de données LOB n’étant pas pris en charge par Snowflake, il n’y a pas d’équivalent pour les fonctions DBMS_LOB et il n’existe pas encore de solution de contournement.

EWIs connexes

  1. SSC-EWI-OR0076: Paquet intégré non pris en charge.

Type de données CLOB

Description

Un objet de type caractères de grande taille contenant des caractères à un octet ou à plusieurs octets. Les ensembles de caractères à largeur fixe et à largeur variable sont pris en charge, tous deux utilisant le jeu de caractères de la base de données. (Référence linguistique Oracle SQL Type de données CLOB).

Avertissement

Le type de données CLOB n’est pas pris en charge dans Snowflake. VARCHAR est utilisé à la place.

Modèles d’échantillons de sources

CLOB dans 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

Récupération des données

Oracle
SELECT * FROM clobtable;
Copy
Résultat

CLOB_COLUMN

EMPTY_COLUMN

THIS IS A TEST

Snowflake
SELECT * FROM
clobtable;
Copy
Résultat

CLOB_COLUMN

EMPTY_COLUMN

THIS IS A TEST

-

Problèmes connus

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

La taille maximale d’une colonne Oracle CLOB est (4 gigaoctets - 1) * (taille du bloc de base de données) , mais la taille maximale de la colonne Snowflake VARCHAR est limitée à 16MB.

2. Empty value with EMPTY_CLOB

L’initialisation d’une colonne à l’aide de EMPTY_CLOB() renverra un emplacement LOB vide. Dans Snowflake, après la traduction, la colonne renvoie une chaîne contenant « - ».

3. No access to the DBMS_LOB built-in package

Les types de données LOB n’étant pas pris en charge dans Snowflake, il n’existe pas d’équivalent pour les fonctions DBMS_LOB et aucune solution de contournement n’a encore été mise en œuvre.

EWIs connexes

Pas d’EWIs connexes.

Type de données NCLOB

Description

Un objet de type caractères de grande taille contenant des caractères Unicode. Les ensembles de caractères à largeur fixe et à largeur variable sont pris en charge, tous deux utilisant le jeu de caractères national de la base de données. (Référence linguistique Oracle SQL Type de données NCLOB).

Avertissement

Le type de données NCLOB n’est pas pris en charge dans Snowflake. VARCHAR est utilisé à la place.

Modèles d’échantillons de sources

NCLOB dans 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

Récupération des données

Oracle
SELECT * FROM nclobtable;
Copy
Résultat

NCLOB_COLUMN

EMPTY_COLUMN

THIS IS A TEST

Snowflake
SELECT * FROM
nclobtable;
Copy
Résultat

NCLOB_COLUMN

EMPTY_COLUMN

THIS IS A TEST

-

Problèmes connus

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

La taille maximale d’une colonne Oracle NCLOB est (4 gigaoctets - 1) * (taille du bloc de base de données) , mais la taille maximale de la colonne Snowflake VARCHAR est limitée à 16MB.

2. Empty value with EMPTY_CLOB

L’initialisation d’une colonne à l’aide de EMPTY_CLOB() renverra un emplacement LOB vide. Après la traduction, la colonne renvoie une chaîne contenant « - ».

3. No access to the DBMS_LOB built-in package

Les types de données LOB n’étant pas pris en charge dans Snowflake, il n’existe pas d’équivalent pour les fonctions DBMS_LOB et aucune solution de contournement n’a encore été mise en œuvre.

EWIs connexes

Pas d’EWIs connexes.