SnowConvert : Instructions Oracle SQL¶
Alter Table¶
Note
Certaines parties du code de sortie sont omises pour des raisons de clarté.
1. Description¶
Utilisez l’instruction ALTER TABLE pour modifier la définition d’une table non partitionnée, d’une table partitionnée, d’une partition de table ou d’une sous-partition de table. Pour les tables d’objets ou les tables relationnelles avec des colonnes d’objets, utilisez ALTER TABLE pour convertir la table à la dernière définition de son type référencé après que le type a été modifié (Documentation Oracle).
Syntaxe Oracle
ALTER TABLE [ schema. ] table
[ alter_table_properties
| column_clauses
| constraint_clauses
| alter_table_partitioning
| alter_external_table
| move_table_clause
]
[ enable_disable_clause
| { ENABLE | DISABLE } { TABLE LOCK | ALL TRIGGERS }
] ...
;
Note
Pour connaître la syntaxe Snowflake, consultez la documentation suivante.
2. Sample Source Patterns¶
2.1. Alter table avec des clauses¶
Avertissement
memoptimize_read_clause et memoptimize_read_clause ne sont pas applicables dans Snowflake et sont donc supprimées.
Oracle
ALTER TABLE SOMESCHEMA.SOMENAME
MEMOPTIMIZE FOR READ
MEMOPTIMIZE FOR WRITE
ADD (SOMECOLUMN NUMBER , SOMEOTHERCOLUMN VARCHAR(23))
(PARTITION PT NESTED TABLE COLUMN_VALUE STORE AS SNAME
( SUBPARTITION SPART NESTED TABLE COLUMN_VALUE STORE AS SNAME))
ENABLE TABLE LOCK;
Snowflake
ALTER TABLE SOMESCHEMA.SOMENAME
ADD (SOMECOLUMN NUMBER(38, 18), SOMEOTHERCOLUMN VARCHAR(23));
Note
Seuls certaines column_clauses et constraint_clauses sont applicables dans Snowflake. Dans Oracle, table alter permet de modifier les propriétés des partitions créées, mais dans Snowflake, ces actions ne sont pas nécessaires
2.2. Alter table avec cas non pris en charge¶
Oracle
ALTER TABLE SOMENAME MODIFY COLUMN SCOLUMN NOT SUBSTITUTABLE AT ALL LEVELS FORCE;
ALTER TABLE SOMENAME MODIFY(SCOLUMN VISIBLE,SCOLUMN INVISIBLE);
ALTER TABLE SOMENAME MODIFY VARRAY VARRAYITEM (
STORAGE(PCTINCREASE 10));
Snowflake
!!!RESOLVE EWI!!! /*** SSC-EWI-0109 - ALTER TABLE SYNTAX NOT APPLICABLE IN SNOWFLAKE ***/!!!
ALTER TABLE SOMENAME
MODIFY COLUMN SCOLUMN NOT SUBSTITUTABLE AT ALL LEVELS FORCE;
!!!RESOLVE EWI!!! /*** SSC-EWI-0109 - ALTER TABLE SYNTAX NOT APPLICABLE IN SNOWFLAKE ***/!!!
ALTER TABLE SOMENAME
MODIFY(SCOLUMN VISIBLE,SCOLUMN INVISIBLE);
!!!RESOLVE EWI!!! /*** SSC-EWI-0109 - ALTER TABLE SYNTAX NOT APPLICABLE IN SNOWFLAKE ***/!!!
ALTER TABLE SOMENAME
MODIFY VARRAY VARRAYITEM (
STORAGE(PCTINCREASE 10));
2.3. Action ADDCONSTRAINT¶
L’action ADD CONSTRAINT a un équivalent dans Snowflake, mais elle ne permet d’ajouter qu’une seule contrainte par instruction ALTER TABLE. Elle sera donc commentée lorsque l’instruction contient deux contraintes ou plus.
Avertissement
enable_disable_clause est supprimée car elle n’est pas pertinente dans Snowflake.
Oracle
-- MULTIPLE CONSTRAINT ADDITION SCENARIO
ALTER TABLE TABLE1 ADD (
CONSTRAINT TABLE1_PK
PRIMARY KEY
(ID)
ENABLE VALIDATE,
CONSTRAINT TABLE1_FK foreign key(ID2)
references TABLE2 (ID) ON DELETE CASCADE);
-- ONLY ONE CONSTRAINT ADDITION SCENARIO
ALTER TABLE TABLE1 ADD (
CONSTRAINT TABLE1_FK foreign key(ID2)
references TABLE2 (ID) ON DELETE CASCADE);
Snowflake
-- MULTIPLE CONSTRAINT ADDITION SCENARIO
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0067 - MULTIPLE CONSTRAINT DEFINITION IN A SINGLE STATEMENT IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
ALTER TABLE TABLE1
ADD (
CONSTRAINT TABLE1_PK
PRIMARY KEY
(ID) ,
CONSTRAINT TABLE1_FK foreign key(ID2)
references TABLE2 (ID) ON DELETE CASCADE);
-- ONLY ONE CONSTRAINT ADDITION SCENARIO
ALTER TABLE TABLE1
ADD
CONSTRAINT TABLE1_FK foreign key(ID2)
references TABLE2 (ID) ON DELETE CASCADE;
Problèmes connus¶
Certaines propriétés figurant dans les tables peuvent être adaptées ou ne pas être applicables.
Create Database Link¶
Avertissement
Actuellement, l’instruction _ Create Database Link _ n’est pas convertie mais elle est analysée. En outre, si votre code source contient des instructionscreate base de données link
, celles-ci seront prises en compte dans le _ Rapport d’évaluation. _
Exemple de code source¶
CREATE PUBLIC DATABASE LINK db_link_name
CONNECT TO CURRENT_USER
USING 'connect string'
CREATE DATABASE LINK db_link_name2
CONNECT TO user_name IDENTIFIED BY user_password
USING 'connect string'
CREATE PUBLIC DATABASE LINK db_link_name3
Sortie Snowflake¶
----** SSC-OOS - OUT OF SCOPE CODE UNIT. CREATE DATABASE LINK IS OUT OF TRANSLATION SCOPE. **
--CREATE PUBLIC DATABASE LINK db_link_name
--CONNECT TO CURRENT_USER
--USING 'connect string'
----** SSC-OOS - OUT OF SCOPE CODE UNIT. CREATE DATABASE LINK IS OUT OF TRANSLATION SCOPE. **
--CREATE DATABASE LINK db_link_name2
--CONNECT TO user_name IDENTIFIED BY user_password
--USING 'connect string'
----** SSC-OOS - OUT OF SCOPE CODE UNIT. CREATE DATABASE LINK IS OUT OF TRANSLATION SCOPE. **
--CREATE PUBLIC DATABASE LINK db_link_name3
Références des liens de base de données¶
Si, dans votre code d’entrée, vous utilisez des objets du lien de la base de données, le code de sortie conservera le nom de ces objets, mais le nom du lien de la base de données qu’ils utilisent sera supprimé.
Exemple de code source¶
-- CREATE DATABASE LINK STATEMENTS
CREATE DATABASE LINK mylink1
CONNECT TO user1 IDENTIFIED BY password1
USING 'my_connection_string1';
CREATE DATABASE LINK mylink2
CONNECT TO user2 IDENTIFIED BY password2
USING 'my_connection_string2';
-- SQL statements that use the database links
SELECT * FROM products@mylink1;
INSERT INTO employees@mylink2
(employee_id, last_name, email, hire_date, job_id)
VALUES (999, 'Claus', 'sclaus@oracle.com', SYSDATE, 'SH_CLERK');
UPDATE jobs@mylink2 SET min_salary = 3000
WHERE job_id = 'SH_CLERK';
DELETE FROM employees@mylink2
WHERE employee_id = 999;
-- SQL statement where it uses an object from
-- a database link that is not created
SELECT * FROM products@mylink;
Sortie Snowflake¶
---- CREATE DATABASE LINK STATEMENTS
----** SSC-OOS - OUT OF SCOPE CODE UNIT. CREATE DATABASE LINK IS OUT OF TRANSLATION SCOPE. **
--CREATE DATABASE LINK mylink1
-- CONNECT TO user1 IDENTIFIED BY password1
-- USING 'my_connection_string1'
----** SSC-OOS - OUT OF SCOPE CODE UNIT. CREATE DATABASE LINK IS OUT OF TRANSLATION SCOPE. **
--CREATE DATABASE LINK mylink2
-- CONNECT TO user2 IDENTIFIED BY password2
-- USING 'my_connection_string2'
-- SQL statements that use the database links
SELECT * FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0123 - DBLINK CONNECTIONS NOT SUPPORTED [ DBLINK : mylink1 | USER: user1/password1 | CONNECTION: 'my_connection_string1' ] ***/!!!
products;
INSERT INTO
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0123 - DBLINK CONNECTIONS NOT SUPPORTED [ DBLINK : mylink2 | USER: user2/password2 | CONNECTION: 'my_connection_string2' ] ***/!!!
employees
(employee_id, last_name, email, hire_date, job_id)
VALUES (999, 'Claus', 'sclaus@oracle.com', CURRENT_TIMESTAMP(), 'SH_CLERK');
UPDATE
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0123 - DBLINK CONNECTIONS NOT SUPPORTED [ DBLINK : mylink2 | USER: user2/password2 | CONNECTION: 'my_connection_string2' ] ***/!!!
jobs
SET min_salary = 3000
WHERE job_id = 'SH_CLERK';
DELETE FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0123 - DBLINK CONNECTIONS NOT SUPPORTED [ DBLINK : mylink2 | USER: user2/password2 | CONNECTION: 'my_connection_string2' ] ***/!!!
employees
WHERE employee_id = 999;
-- SQL statement where it uses an object from
-- a database link that is not created
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "mylink" **
SELECT * FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0123 - DBLINK CONNECTIONS NOT SUPPORTED [ DBLINK : mylink | USER: / | CONNECTION: ] ***/!!!
products;
EWIs connexes¶
SSC-EWI-OR0123 : Les connexions Db Link ne sont pas prises en charge.
SSC-FDM-0007 : Élément avec des dépendances manquantes.
Drop Table¶
Note
Certaines parties du code de sortie sont omises pour des raisons de clarté.
Description¶
L’instruction Drop Table permet de supprimer une table. Cette instruction varie quelque peu entre Oracle et Snowflake. Veuillez vérifier chaque documentation pour plus d’informations sur les différences.
Dans Oracle, la syntaxe Drop Table est la suivante :
DROP TABLE <table_name> [ CASCADE CONSTRAINTS ] [ PURGE ]
Dans Snowflake, la syntaxe Drop Table est la suivante :
DROP TABLE [ IF EXISTS ] <table_name> [ CASCADE | RESTRICT ]
La principale différence est que Snowflake n’a pas de clause égale pour PURGE, car la table ne sera pas définitivement supprimée du système. Cependant, les clauses CASCADE CONSTRAINTS et CASCADE sont les mêmes. Tous deux suppriment la table, même s’il existe des clés étrangères qui font référence à cette table.
Exemples¶
Voyons maintenant quelques exemples de code, et ce à quoi il ressemblerait après avoir été transformé. Chaque exemple utilise une variante différente de l’instruction Drop Table.
Exemple 1 :¶
Cet exemple utilise l’instruction Drop Table aussi simple que possible.
Code d’entrée :
DROP TABLE TEST_TABLE1;
Code transformé :
DROP TABLE TEST_TABLE1;
Exemple 2 :¶
Cet exemple utilise l’instruction Drop Table avec la clause PURGE. Rappelez-vous qu’il n’y a pas d’équivalent dans Snowflake pour la clause PURGE à l’intérieur d’une instruction Drop Table.
Code d’entrée :
DROP TABLE TEST_TABLE1 PURGE;
Code transformé :
DROP TABLE TEST_TABLE1;
Exemple 3 :¶
Cet exemple utilise l’instruction Drop Table avec la clause CASCADE CONSTRAINTS.
Code d’entrée :
DROP TABLE TEST_TABLE1 CASCADE CONSTRAINTS;
Code transformé :
DROP TABLE TEST_TABLE1 CASCADE;
Dans le code transformé, le mot CONSTRAINTS est supprimé de la clause CASCADE CONSTRAINTS.
Exemple 4 :¶
Cet exemple utilise l’instruction Drop Table avec les clauses CASCADE CONSTRAINTS et PURGE.
Code d’entrée :
DROP TABLE TEST_TABLE1 CASCADE CONSTRAINTS PURGE;
Code transformé :
DROP TABLE TEST_TABLE1 CASCADE;
Comme on l’a vu, le code change. Dans le nouveau code Snowflake, la clause PURGE est supprimée et le mot CONSTRAINTS est également supprimé de la clause CASCADE.
Équivalence fonctionnelle¶
Exécutez le code suivant pour vérifier l’équivalence fonctionnelle. Gardez à l’esprit que la seule partie qui n’est pas équivalente est la clause PURGE, qui, dans Oracle, supprime complètement la table du système et qu’il n’y a pas d’équivalent pour Snowflake. Dans les deux cas, la table est supprimée même si elle est référencée dans une autre table.
Oracle :
CREATE TABLE TEST_TABLE2 (
col2 INTEGER,
CONSTRAINT constraint_name PRIMARY KEY (col2)
);
CREATE TABLE OTHER_TABLE (
other_col INTEGER REFERENCES TEST_TABLE2 (col2)
);
DROP TABLE TEST_TABLE2 CASCADE CONSTRAINTS PURGE;
Snowflake :
CREATE OR REPLACE TABLE TEST_TABLE2 (
col2 INTEGER,
CONSTRAINT constraint_name PRIMARY KEY (col2)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
CREATE OR REPLACE TABLE OTHER_TABLE (
other_col INTEGER REFERENCES TEST_TABLE2 (col2)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
DROP TABLE TEST_TABLE2 CASCADE;
EWIs connexes¶
Pas d’EWIs connexes.
Create Index¶
Avertissement
Actuellement, l’instruction _ Create Index _ n’est pas convertie mais elle est analysée. De même, si votre code source comporte des instructions create index
, celles-ci seront prises en compte dans le _ rapport d’évaluation. _
Exemple de code de create index analysé :¶
CREATE UNIQUE INDEX COL1_INDEX ILM (ADD POLICY OPTIMIZE AFTER 10 DAYS OF NO ACCESS) ON CLUSTER CLUSTER1
ONLINE USABLE DEFERRED INVALIDATION;
CREATE BITMAP INDEX COL1_INDEX ILM (ADD POLICY OPTIMIZE ( ON FUNC1 )) ON TABLE1 AS TAB1 (COL1 ASC) GLOBAL PARTITION BY RANGE (COL1, COL2) ( PARTITION VALUES LESS THAN (MAXVALUE) ) UNUSABLE IMMEDIATE INVALIDATION;
CREATE MULTIVALUE INDEX COL1_INDEX ILM (ADD POLICY SEGMENT TIER TO LOW_COST_TBS) ON TABLE1( TAB1 COL1 DESC, TAB1 COL2 ASC) FROM TABLE1 AS TAB1 WHERE COL1 > 0 LOCAL STORE IN (STORAGE1)
VISIBLE USABLE DEFERRED INVALIDATION;
CREATE INDEX COL1_INDEX ILM (DELETE POLICY POLICY1) ON CLUSTER CLUSTER1
PCTFREE 10
LOGGING
ONLINE
TABLESPACE DEFAULT
NOCOMPRESS
SORT
REVERSE
VISIBLE
INDEXING PARTIAL
NOPARALLEL;
CREATE INDEX COL1_INDEX ILM (DELETE_ALL) ON TABLE1 AS TAB1 (COL1 ASC) LOCAL (
PARTITION PARTITION1 TABLESPACE TABLESPACE1 NOCOMPRESS USABLE) DEFERRED INVALIDATION;
CREATE INDEX COL1_INDEX ON TABLE1 (COL1 ASC) GLOBAL
PARTITION BY HASH (COL1, COL2) (PARTITION PARTITION1 LOB(LOB1) STORE AS BASICFILE LOB_NAME (TABLESPACE TABLESPACE1)) USABLE IMMEDIATE INVALIDATION;
CREATE INDEX COL1_INDEX ON TABLE1 (COL1 DESC, COL2 ASC) INDEXTYPE IS INDEXTYPE1 LOCAL ( PARTITION PARTITION1 PARAMETERS('PARAMS')) NOPARALLEL PARAMETERS('PARAMS') USABLE DEFERRED INVALIDATION;
CREATE INDEX COL1_INDEX ON TABLE1 (COL1 ASC) INDEXTYPE IS XDB.XMLINDEX LOCAL ( PARTITION PARTITION1) PARALLEL 6 UNUSABLE IMMEDIATE INVALIDATION;
Note
Pour des raisons architecturales, Snowflake ne prend pas en charge les index. Par conséquent, SnowConvert supprimera tout le code lié à la création d’index. Snowflake crée automatiquement des micro-partitions pour chaque table afin d’accélérer les performances des opérations DML. L’utilisateur n’a pas à se préoccuper de la création ou de la gestion de ces micro-partitions.
En général, cela suffit pour obtenir une performance de requête exceptionnellement bonne. Cependant, il existe des moyens de l’améliorer en créant des clés de clustering de données. La page officielle de Snowflake fournit de plus amples informations sur les micropartitions et le clustering de données.
Créer des vues matérialisées¶
Description ¶
Dans Snowconvert, les vues matérialisées Oracle sont transformées en tables dynamiques Snowflake. Pour configurer correctement les tables dynamiques, deux paramètres essentiels doivent être définis : TARGET\LAG et WAREHOUSE. Si ces paramètres ne sont pas spécifiés dans les options de configuration, Snowconvert utilisera par défaut des valeurs prédéfinies lors de la conversion, comme le montre l’exemple ci-dessous.
Pour plus d’informations sur les vues matérialisées, cliquez ici.
Pour plus de détails sur les paramètres nécessaires pour les tables dynamiques, cliquez ici.
Modèles d’échantillons de sources¶
Oracle
CREATE MATERIALIZED VIEW sales_total
AS
SELECT SUM(amount) AS total_sales
FROM sales;
Snowflake
CREATE OR REPLACE DYNAMIC TABLE sales_total
--** SSC-FDM-0031 - DYNAMIC TABLE REQUIRED PARAMETERS SET BY DEFAULT **
TARGET_LAG='1 day'
WAREHOUSE=UPDATE_DUMMY_WAREHOUSE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
AS
SELECT SUM(amount) AS total_sales
FROM
sales;
Modes d’actualisation¶
Les tables dynamiques Snowflake prennent en charge un mode d’actualisation équivalent à celui des vues matérialisées d’Oracle. Les modes correspondants sont les suivants :
Oracle :
FAST : Actualise uniquement les lignes qui ont été modifiées.
COMPLETE : Actualise l’ensemble de la vue matérialisée.
FORCE : Utilise FAST si possible, sinon utilise COMPLETE.
Snowflake :
AUTO : Détermine automatiquement la meilleure méthode d’actualisation.
FULL : Actualise la table entière, ce qui équivaut au mode COMPLETE d’Oracle.
INCREMENTAL : Actualise uniquement les lignes modifiées.
Mode d’actualisation par défaut¶
Lorsque vous utilisez SnowConvert, le mode d’actualisation par défaut de la table dynamique est AUTO.
Mappages de modes¶
Oracle FAST et FORCE -> Snowflake AUTO
Oracle COMPLETE -> Snowflake FULL
Pour plus de détails, référez-vous à la documentation officielle sur les modes d’actualisation Oracle et les modes d’actualisation Snowflake.
Oracle
CREATE MATERIALIZED VIEW CUSTOMER_SALES_SUMMARY
REFRESH COMPLETE
AS
SELECT
CUSTOMER_ID,
SUM(AMOUNT) AS TOTAL_AMOUNT
FROM
SALES
GROUP BY
CUSTOMER_ID;
Snowflake
CREATE OR REPLACE DYNAMIC TABLE CUSTOMER_SALES_SUMMARY
--** SSC-FDM-0031 - DYNAMIC TABLE REQUIRED PARAMETERS SET BY DEFAULT **
TARGET_LAG='1 day'
WAREHOUSE=UPDATE_DUMMY_WAREHOUSE
REFRESH_MODE=FULL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
AS
SELECT
CUSTOMER_ID,
SUM(AMOUNT) AS TOTAL_AMOUNT
FROM
SALES
GROUP BY
CUSTOMER_ID;
Problèmes connus¶
Aucune erreur connue n’a été détectée pour le moment.
EWIs connexes¶
ssc-fdm-0031.md : Paramètres obligatoires de la table dynamique définis par défaut
Create Sequence¶
Voyons d’abord un exemple de code et ce à quoi il ressemblerait après avoir été transformé.
Code d’entrée :¶
CREATE SEQUENCE SequenceSample
START WITH 1000
INCREMENT BY 1
NOCACHE
NOCYCLE;
Code de sortie :¶
CREATE OR REPLACE SEQUENCE SequenceSample
START WITH 1000
INCREMENT BY 1
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}';
La première modification apportée consiste à appliquer le schéma ou l’entrepôt de données au nom de la séquence. La deuxième transformation consiste à supprimer certains éléments et à les ajouter en tant que commentaires, étant donné qu’oracle possède certains éléments dans la séquence de création qui ne sont pas pris en charge par le support Snowflake.
Dans Oracle, après le nom de la séquence, les éléments qui font l’objet d’un commentaire sur NOT sont les suivants
START WITH 1000
INCREMENT BY 1
Si l’élément n’en fait pas partie, il sera commenté et ajouté en tant qu’avertissement juste avant la séquence de création, comme dans l’exemple.
Les éléments suivants sont supprimés
MAXVALUE
NOMAXVALUE
MINVALUE
NOMINVALUE
CYCLE
NOCYCLE
CACHE
NOCACHE
ORDER
NOORDER
KEEP
NOKEEP
SESSION
GLOBAL
SCALE
EXTEND
SCALE
NOEXTEND
NOSCALE
SHARD
EXTEND
SHARD
NOEXTEND
NOSHARD
SEQUENCE EXPRESSIONS¶
NEXTVAL : La grammaire Snowflake est la même que celle d’Oracle.
CURRVAL : Snowflake n’a pas d’équivalent, elle est donc transformée en une fonction stub. Consultez ce lien pour comprendre l’approche de Snowflake.
Code d’entrée :¶
select seq1.nextval from dual;
select seq1.currval from dual;
Code de sortie :¶
select seq1.nextval from dual;
select
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0069 - THE SEQUENCE CURRVAL PROPERTY IS NOT SUPPORTED IN SNOWFLAKE. ***/!!! seq1.currval from dual;
Séquence START WITH¶
La valeur de l’instruction START WITH
peut dépasser la valeur maximale autorisée par Snowflake. Voici ce que dit Snowflake à propos de la valeur de départ : Spécifiez la première valeur retournée par la séquence. Les valeurs prises en charge sont toutes les valeurs qui peuvent être représentées par un entier de 64 bits à deux compléments (de -2^63
à 2^63-1
). Ainsi, d’après ce qui précède, la valeur maximale autorisée est 9223372036854775807 pour les nombres positifs et 9223372036854775808 pour les nombres négatifs.
Exemple de code¶
Code d’entrée :¶
CREATE SEQUENCE SEQUENCE1
START WITH 9223372036854775808;
CREATE SEQUENCE SEQUENCE2
START WITH -9223372036854775809;
Code de sortie :¶
CREATE OR REPLACE SEQUENCE SEQUENCE1
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0068 - SEQUENCE START VALUE EXCEEDS THE MAX VALUE ALLOWED BY SNOWFLAKE. ***/!!!
START WITH 9223372036854775808
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}';
CREATE OR REPLACE SEQUENCE SEQUENCE2
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0068 - SEQUENCE START VALUE EXCEEDS THE MAX VALUE ALLOWED BY SNOWFLAKE. ***/!!!
START WITH -9223372036854775809
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}';
EWIs connexes¶
SSC-EWI-OR0069 : La propriété de la séquence CURRVAL n’est pas prise en charge dans Snowflake.
SSC-EWI-OR0068 : La valeur de début de séquence dépasse la valeur maximale autorisée par Snowflake.
Alter Session¶
Alter session¶
Alter session a un équivalent dans Snowflake et certaines variables sont mappées à des variables Snowflake. Si une permutation d’Alter Session n’est pas prise en charge, le nœud sera commenté et un avertissement sera ajouté.
Code Oracle :¶
alter session set nls_date_format = 'DD-MM-YYYY';
Code Snowflake :¶
ALTER SESSION SET DATE_INPUT_FORMAT = 'DD-MM-YYYY' DATE_OUTPUT_FORMAT = 'DD-MM-YYYY';
Référence des paramètres de session¶
Note
Les paramètres de session qui n’apparaissent pas dans la table ne sont pas actuellement transformés.
Paramètre de session |
Transformation Snowflake |
---|---|
NLS_DATE_FORMAT |
DATE_INPUT_FORMAT et DATE_OUTPUT_FORMAT |
NLS_NUMERIC_CHARACTERS |
NOT SUPPORTED |
Problèmes connus ¶
Aucun problème n’a été constaté.
EWIs connexes ¶
Pas d’EWIs connexes.
Create Synonym¶
Note
Certaines parties du code de sortie sont omises pour des raisons de clarté.
Create Synonym¶
Les synonymes ne sont pas pris en charge par Snowflake. Les références aux synonymes seront modifiées pour l’objet d’origine.
Code d’entrée :¶
CREATE OR REPLACE SYNONYM B.TABLITA_SYNONYM FOR TABLITA;
Code de sortie :¶
----** SSC-FDM-OR0005 - SYNONYMS NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS SYNONYM WERE CHANGED BY THE ORIGINAL OBJECT NAME. **
--CREATE OR REPLACE SYNONYM B.TABLITA_SYNONYM FOR TABLITA
;
Exemple 1 : Synonyme faisant référence à une table.¶
Code source Oracle :
CREATE TABLE TABLITA
(
COLUMN1 NUMBER
);
CREATE OR REPLACE SYNONYM B.TABLITA_SYNONYM FOR TABLITA;
SELECT * FROM B.TABLITA_SYNONYM WHERE B.TABLITA_SYNONYM.COLUMN1 = 20;
Code migré de Snowflake : vous remarquerez que le site SELECT
faisait initialement référence à un synonyme, mais qu’il fait désormais référence à la table qui pointe vers le synonyme.
CREATE OR REPLACE TABLE TABLITA
(
COLUMN1 NUMBER(38, 18) /*** 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"}}'
;
-- --** SSC-FDM-OR0005 - SYNONYMS NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS SYNONYM WERE CHANGED BY THE ORIGINAL OBJECT NAME. **
-- CREATE OR REPLACE SYNONYM B.TABLITA_SYNONYM FOR TABLITA
;
SELECT * FROM
TABLITA
WHERE
TABLITA.COLUMN1 = 20;
Exemple 2 : Synonyme qui renvoie à un autre synonyme.¶
Code source Oracle :
CREATE TABLE TABLITA
(
COLUMN1 NUMBER
);
CREATE OR REPLACE SYNONYM B.TABLITA_SYNONYM FOR TABLITA;
CREATE OR REPLACE SYNONYM C.TABLITA_SYNONYM2 FOR B.TABLITA_SYNONYM;
SELECT * FROM C.TABLITA_SYNONYM2 WHERE C.TABLITA_SYNONYM2.COLUMN1 = 20;
UPDATE C.TABLITA_SYNONYM2 SET COLUMN1 = 10;
INSERT INTO C.TABLITA_SYNONYM2 VALUES (1);
Code migré Snowflake : vous remarquerez qu’à l’origine, les SELECT
, UPDATE
, INSERT
font référence à un synonyme et qu’à présent, ils font référence à l’objet atomique, c’est-à-dire à une table.
CREATE OR REPLACE TABLE TABLITA
(
COLUMN1 NUMBER(38, 18) /*** 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"}}'
;
-- --** SSC-FDM-OR0005 - SYNONYMS NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS SYNONYM WERE CHANGED BY THE ORIGINAL OBJECT NAME. **
-- CREATE OR REPLACE SYNONYM B.TABLITA_SYNONYM FOR TABLITA
;
-- --** SSC-FDM-OR0005 - SYNONYMS NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS SYNONYM WERE CHANGED BY THE ORIGINAL OBJECT NAME. **
--CREATE OR REPLACE SYNONYM C.TABLITA_SYNONYM2 FOR B.TABLITA_SYNONYM
;
SELECT * FROM
TABLITA
WHERE
TABLITA.COLUMN1 = 20;
UPDATE TABLITA
SET COLUMN1 = 10;
INSERT INTO TABLITA
VALUES (1);
Exemple 3 : Synonyme faisant référence à une vue¶
Code source Oracle
CREATE OR REPLACE SYNONYM B.TABLITA_SYNONYM FOR TABLITA;
CREATE OR REPLACE SYNONYM C.TABLITA_SYNONYM2 FOR B.TABLITA_SYNONYM;
CREATE VIEW VIEW_ORGINAL AS SELECT * FROM C.TABLITA_SYNONYM2;
CREATE OR REPLACE SYNONYM VIEW_SYNONYM FOR VIEW_ORGINAL;
SELECT * FROM VIEW_SYNONYM;
Code migré Snowflake : vous remarquerez que le SELECT
faisait initialement référence à un synonyme, et qu’il fait maintenant référence à l’objet atomique, qui est une vue.
----** SSC-FDM-OR0005 - SYNONYMS NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS SYNONYM WERE CHANGED BY THE ORIGINAL OBJECT NAME. **
--CREATE OR REPLACE SYNONYM B.TABLITA_SYNONYM FOR TABLITA
;
----** SSC-FDM-OR0005 - SYNONYMS NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS SYNONYM WERE CHANGED BY THE ORIGINAL OBJECT NAME. **
--CREATE OR REPLACE SYNONYM C.TABLITA_SYNONYM2 FOR B.TABLITA_SYNONYM
;
CREATE OR REPLACE VIEW VIEW_ORGINAL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
AS
--** SSC-FDM-0001 - VIEWS SELECTING ALL COLUMNS FROM A SINGLE TABLE ARE NOT REQUIRED IN SNOWFLAKE AND MAY IMPACT PERFORMANCE. **
SELECT * FROM
TABLITA;
----** SSC-FDM-OR0005 - SYNONYMS NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS SYNONYM WERE CHANGED BY THE ORIGINAL OBJECT NAME. **
--CREATE OR REPLACE SYNONYM VIEW_SYNONYM FOR VIEW_ORGINAL
;
SELECT * FROM
VIEW_ORGINAL;
La transformation des synonymes peut être activée ou désactivée à partir des paramètres de UI.
EWIs connexes¶
SSC-FDM-0001 : Les vues sélectionnant toutes les colonnes d’une même table ne sont pas exigées dans Snowflake.
SSC-FDM-0006 : La colonne de type nombre peut ne pas se comporter de la même manière dans Snowflake.
SSC-FDM-OR0005 : Les synonymes ne sont pas pris en charge dans Snowflake mais les références à ce synonyme ont été modifiées par le nom de l’objet original.
Create Table¶
1. Description¶
Dans Oracle, l’instruction CREATE TABLE est utilisée pour créer l’un des types de tables suivants : une table relationnelle qui est la structure de base pour contenir les données de l’utilisateur, ou une table objet qui est une table qui utilise un type d’objet pour la définition d’une colonne. (Documentation Oracle)
Syntaxe Oracle
CREATE [ { GLOBAL | PRIVATE } TEMPORARY | SHARDED | DUPLICATED | [ IMMUTABLE ] BLOCKCHAIN
| IMMUTABLE ]
TABLE
[ schema. ] table
[ SHARING = { METADATA | DATA | EXTENDED DATA | NONE } ]
{ relational_table | object_table | XMLType_table }
[ MEMOPTIMIZE FOR READ ]
[ MEMOPTIMIZE FOR WRITE ]
[ PARENT [ schema. ] table ] ;
Syntaxe Snowflake
CREATE [ OR REPLACE ]
[ { [ { LOCAL | GLOBAL } ] TEMP | TEMPORARY | VOLATILE | TRANSIENT } ]
TABLE [ IF NOT EXISTS ] <table_name> (
-- Column definition
<col_name> <col_type>
[ inlineConstraint ]
[ NOT NULL ]
[ COLLATE '<collation_specification>' ]
[
{
DEFAULT <expr>
| { AUTOINCREMENT | IDENTITY }
[
{
( <start_num> , <step_num> )
| START <num> INCREMENT <num>
}
]
[ { ORDER | NOORDER } ]
}
]
[ [ WITH ] MASKING POLICY <policy_name> [ USING ( <col_name> , <cond_col1> , ... ) ] ]
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
[ COMMENT '<string_literal>' ]
-- Additional column definitions
[ , <col_name> <col_type> [ ... ] ]
-- Out-of-line constraints
[ , outoflineConstraint [ ... ] ]
)
[ CLUSTER BY ( <expr> [ , <expr> , ... ] ) ]
[ ENABLE_SCHEMA_EVOLUTION = { TRUE | FALSE } ]
[ STAGE_FILE_FORMAT = (
{ FORMAT_NAME = '<file_format_name>'
| TYPE = { CSV | JSON | AVRO | ORC | PARQUET | XML } [ formatTypeOptions ]
} ) ]
[ STAGE_COPY_OPTIONS = ( copyOptions ) ]
[ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
[ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
[ CHANGE_TRACKING = { TRUE | FALSE } ]
[ DEFAULT_DDL_COLLATION = '<collation_specification>' ]
[ COPY GRANTS ]
[ COMMENT = '<string_literal>' ]
[ [ WITH ] ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
Note
Pour plus d’informations sur Snowflake, consultez la documentation suivante.
2. Sample Source Patterns¶
2.1. Propriétés physiques et de table¶
Oracle
CREATE TABLE "MySchema"."BaseTable"
(
BaseId NUMBER DEFAULT 10 NOT NULL ENABLE
) SEGMENT CREATION IMMEDIATE
PCTFREE 0 PCTUSED 40 INITRANS 1 MAXTRANS 255
COLUMN STORE COMPRESS FOR QUERY HIGH NO ROW LEVEL LOCKING LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "MyTableSpace"
PARTITION BY LIST ("BaseId")
(
PARTITION "P20211231" VALUES (20211231) SEGMENT CREATION DEFERRED
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
ROW STORE COMPRESS ADVANCED LOGGING
STORAGE(
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "MyTableSpace"
)
PARALLEL;
Snowflake
CREATE OR REPLACE TABLE "MySchema"."BaseTable"
(
BaseId NUMBER(38, 18) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/ DEFAULT 10 NOT NULL
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
Note
Les propriétés des tables sont supprimées car elles ne sont pas requises après la migration dans Snowflake.
2.2. Contraintes et états de contrainte¶
Les contraintes suivantes seront commentées :
Contrainte
CHECK
Note
La contrainte USING INDEX
sera entièrement supprimée du code de sortie lors de la conversion.
Oracle
CREATE TABLE "MySchema"."BaseTable"
(
BaseId NUMBER DEFAULT 10 NOT NULL ENABLE NOVALIDATE,
"COL1" NUMBER CHECK( "COL1" IS NOT NULL ),
CHECK( "COL1" IS NOT NULL ),
CONSTRAINT "Constraint1BaseTable" PRIMARY KEY (BaseId)
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1) ENABLE
);
Snowflake
CREATE OR REPLACE TABLE "MySchema"."BaseTable"
(
BaseId NUMBER(38, 18) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/ DEFAULT 10 NOT NULL,
"COL1" NUMBER(38, 18) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/ NOT NULL
!!!RESOLVE EWI!!! /*** SSC-EWI-0035 - CHECK STATEMENT NOT SUPPORTED ***/!!!
CHECK( "COL1" IS NOT NULL ),
!!!RESOLVE EWI!!! /*** SSC-EWI-0035 - CHECK STATEMENT NOT SUPPORTED ***/!!!
CHECK( "COL1" IS NOT NULL ),
CONSTRAINT "Constraint1BaseTable" PRIMARY KEY (BaseId)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
;
D’autre part, mais de la même manière, si vous avez un état de contrainte quelconque après une contrainte NOT NULL comme suit :
RELY
NO RELY
RELY ENABLE
RELY DISABLE
VALIDATE
NOVALIDATE
Ceux-ci feront également l’objet d’un commentaire.
Note
L’état de la contrainte ENABLE sera complètement supprimé du code de sortie au cours du processus de conversion. Dans le cas de l’état DISABLE, il sera également supprimé en même temps que la contrainte NOT NULL.
Oracle
CREATE TABLE Table1(
col1 INT NOT NULL ENABLE,
col2 INT NOT NULL DISABLE,
col3 INT NOT NULL RELY
);
Snowflake
CREATE OR REPLACE TABLE Table1 (
col1 INT NOT NULL,
col2 INT ,
col3 INT NOT NULL /*** SSC-FDM-OR0006 - CONSTRAINT STATE RELY REMOVED FROM NOT NULL INLINE CONSTRAINT ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
2.3. Clé étrangère¶
S’il existe une table avec une colonne NUMBER sans précision ni échelle, et une autre table avec une colonne NUMBER(*, 0) qui fait référence à la colonne NUMBER mentionnée précédemment, nous commenterons cette clé étrangère.
Oracle
CREATE TABLE "MySchema"."MyTable"
(
"COL1" NUMBER,
CONSTRAINT "PK" PRIMARY KEY ("COL1")
);
Snowflake
CREATE OR REPLACE TABLE "MySchema"."MyTable"
(
"COL1" NUMBER(38, 18) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/,
CONSTRAINT "PK" PRIMARY KEY ("COL1")
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
2.4. Colonne virtuelle¶
Oracle
CREATE TABLE "MySchema"."MyTable"
(
"COL1" NUMBER GENERATED ALWAYS AS (COL1 * COL2) VIRTUAL
);
Snowflake
CREATE OR REPLACE TABLE "MySchema"."MyTable"
(
"COL1" NUMBER(38, 18) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/ AS (COL1 * COL2)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
2.5. Colonne d’identité¶
Pour les colonnes d’identité, une séquence est créée et attribuée à la colonne.
Oracle
CREATE TABLE "MySchema"."BaseTable"
(
"COL0" NUMBER GENERATED BY DEFAULT ON NULL
AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999
INCREMENT BY 1
START WITH 621
CACHE 20
NOORDER NOCYCLE NOT NULL ENABLE
);
Snowflake
CREATE OR REPLACE SEQUENCE MySchema.BaseTable_COL0
INCREMENT BY 1
START WITH 621
COMMENT = 'FOR TABLE-COLUMN "MySchema.BaseTable".COL0';
CREATE OR REPLACE TABLE "MySchema"."BaseTable" (
"COL0" NUMBER(38, 18) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/ DEFAULT MySchema.BaseTable_COL0.NEXTVAL NOT NULL
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
2.6. Déclaration de colonne CLOB et BLOB¶
Les colonnes déclarées comme CLOB ou BLOB seront remplacées par VARCHAR.
Oracle
CREATE TABLE T
(
Col1 BLOB DEFAULT EMPTY_BLOB(),
Col5 CLOB DEFAULT EMPTY_CLOB()
);
Snowflake
CREATE OR REPLACE TABLE T
(
Col1 BINARY,
Col5 VARCHAR
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
2.7. Nom de contrainte¶
Avertissement
Le nom de contrainte est supprimé du code car il n’est pas applicable dans Snowflake.
Oracle
CREATE TABLE "CustomSchema"."BaseTable"(
"PROPERTY" VARCHAR2(64) CONSTRAINT "MICROSOFT_NN_PROPERTY" NOT NULL ENABLE
);
Snowflake
CREATE OR REPLACE TABLE "CustomSchema"."BaseTable" (
"PROPERTY" VARCHAR(64) NOT NULL
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
2.8. Colonnes par défaut avec les heures¶
Les colonnes déclarées comme étant des types de date seront converties pour correspondre au type de date spécifique.
Oracle
CREATE TABLE TABLE1
(
"COL1" VARCHAR(50) DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE TABLE1
(
COL0 TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP,
COL1 TIMESTAMP(6) DEFAULT CURRENT_TIME,
COL2 TIMESTAMP(6) WITH LOCAL TIME ZONE DEFAULT '1900-01-01 12:00:00',
COL3 TIMESTAMP(6) WITH TIME ZONE DEFAULT '1900-01-01 12:00:00',
COL4 TIMESTAMP(6) WITHOUT TIME ZONE DEFAULT '1900-01-01 12:00:00',
COL5 TIMESTAMP(6) DEFAULT TO_TIMESTAMP('01/01/1900 12:00:00.000000 AM', 'MM/DD/YYYY HH:MI:SS.FF6 AM')
);
Snowflake
CREATE OR REPLACE TABLE TABLE1
(
"COL1" VARCHAR(50) DEFAULT TO_VARCHAR(CURRENT_TIMESTAMP(), 'YYYY-MM-DD HH:MI:SS')
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
--** SSC-FDM-0019 - SEMANTIC INFORMATION COULD NOT BE LOADED FOR TABLE1. CHECK IF THE NAME IS INVALID OR DUPLICATED. **
CREATE OR REPLACE TABLE TABLE1
(
COL0 TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP() :: TIMESTAMP(6),
COL1 TIMESTAMP(6) DEFAULT CURRENT_TIME() :: TIMESTAMP(6),
COL2 TIMESTAMP_LTZ(6) DEFAULT '1900-01-01 12:00:00' :: TIMESTAMP_LTZ(6),
COL3 TIMESTAMP_TZ(6) DEFAULT '1900-01-01 12:00:00' :: TIMESTAMP_TZ(6),
COL4 TIMESTAMP(6) WITHOUT TIME ZONE DEFAULT '1900-01-01 12:00:00' :: TIMESTAMP(6) WITHOUT TIME ZONE,
COL5 TIMESTAMP(6) DEFAULT TO_TIMESTAMP('01/01/1900 12:00:00.000000 AM', 'MM/DD/YYYY HH:MI:SS.FF6 AM') :: TIMESTAMP(6)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
2.10 AS SubQuery¶
Les propriétés et clauses suivantes ne sont pas prises en charge lors de la création d’une table via AS SubQuery
dans Snowflake.
[ immutable_table_clauses ]
[ blockchain_table_clauses ]
[ DEFAULT COLLATION collation_name ]
[ ON COMMIT { DROP | PRESERVE } DEFINITION ]
[ ON COMMIT { DELETE | PRESERVE } ROWS ]
[ physical_properties ]
Oracle
create table table1
-- NO DROP NO DELETE HASHING USING sha2_512 VERSION v1 -- blockchain_clause not yet supported
DEFAULT COLLATION somename
ON COMMIT DROP DEFINITION
ON COMMIT DELETE ROWS
COMPRESS
NOLOGGING
AS
select
*
from
table1;
Snowflake
CREATE OR REPLACE TABLE table1
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
-- NO DROP NO DELETE HASHING USING sha2_512 VERSION v1 -- blockchain_clause not yet supported
AS
select
*
from
table1;
Problèmes connus¶
Certaines propriétés des tables peuvent être adaptées ou faire l’objet de commentaires parce que le comportement dans Snowflake est différent.
EWIs connexes¶
SSC-EWI-0035 : Instruction de contrôle non prise en charge.
SSC-FDM-0006 : La colonne de type nombre peut ne pas se comporter de la même manière dans Snowflake.
SSC-FDM-0019 : L’information sémantique n’a pas pu être chargée.
SSC-FDM-OR0042 : Le type de date transformé en horodatage a un comportement différent.
SSC-FDM-OR0006 : État de contrainte supprimé d’une contrainte en ligne non nulle.
Create View¶
Note
Certaines parties du code de sortie sont omises pour des raisons de clarté.
Create View¶
CREATE OR REPLACE VIEW View1 AS SELECT Column1 from Schema1.Table1;
CREATE OR REPLACE VIEW View1
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
AS
SELECT Column1 from
Schema1.Table1;
Les clauses suivantes relatives à Create View sont supprimées :
Pas de force/ Force
Clause d’édition
Clause de partage
Classement par défaut
Clause Bequeath
Clause de conteneur
CREATE OR REPLACE
NO FORCE
NONEDITIONABLE
VIEW Schema1.View1
SHARING = DATA
DEFAULT COLLATION Collation1
BEQUEATH CURRENT_USER
AS SELECT Column1 from Schema1.Table1
CONTAINER_MAP;
CREATE OR REPLACE VIEW Schema1.View1
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
AS
SELECT Column1 from
Schema1.Table1;
Alter View¶
Alter n’est pas encore pris en charge par SnowConvert.
Drop View¶
La clause CASCADE CONSTRAINT n’est pas encore prise en charge.
DROP VIEW Schema1.View1;
DROP VIEW Schema1.View1
CASCADE CONSTRAINTS;
DROP VIEW Schema1.View1;
DROP VIEW Schema1.View1
CASCADE CONSTRAINTS !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'DropBehavior' NODE ***/!!!;
EWIs connexes¶
SSC-EWI-0073 : En attente de l’examen de l’équivalence fonctionnelle.
Create Type¶
Description générale¶
L’une des fonctions les plus importantes du moteur de base de données Oracle est l’approche orientée objet. PL/SQL offre des capacités supérieures aux autres bases de données relationnelles sous la forme de OOP en utilisant des instructions de type Java sous la forme de paquets, de fonctions, de tables et de types. La présente documentation porte sur le dernier point et sur la manière dont SnowConvert le résout, tout en restant conforme à la fonctionnalité.
Oracle prend en charge les spécifications suivantes :
Type de données abstrait (ADT) (y compris un type d’objet SQLJ).
Type de tableau variable autonome (varray).
Type de table imbriquée autonome.
Type d’objet incomplet.
Tout cela d’après les informations trouvées dans la documentation Oracle de l’instruction Create Type
CREATE [ OR REPLACE ] [ EDITIONABLE | NONEDITIONAL ] TYPE <type name>
[ <type source creation options> ]
[<type definition>]
[ <type properties> ]
Limitations¶
Snowflake ne prend pas en charge les types de données définis par l’utilisateur, selon sa documentation en ligne Types de données non pris en charge, mais il prend en charge les types de données semi-structurées, qui peuvent être utilisés pour imiter la structure hiérarchique de la plupart des types définis par l’utilisateur. C’est pourquoi il existe de nombreuses fonctions de type qui n’ont pas de solution de contournement.
Vous trouverez ci-dessous les fonctions des types définis par l’utilisateur pour lesquelles NO propose une solution de contournement :
Sous-types : Hiérarchie des types¶
Ces instructions ne sont pas prises en charge par Snowflake. SnowConvert ne fait que les reconnaître, mais aucune traduction n’est proposée.
CREATE TYPE person_t AS OBJECT (name VARCHAR2(100), ssn NUMBER)
NOT FINAL;
/
CREATE TYPE employee_t UNDER person_t
(department_id NUMBER, salary NUMBER)
NOT FINAL;
/
CREATE TYPE part_time_emp_t UNDER employee_t (num_hrs NUMBER);
/
Propriétés de type¶
Il s’agit des options qui sont normalement utilisées lors de l’utilisation de OOP dans PL/SQL : Persistable, Instantiable et Final.
CREATE OR REPLACE TYPE type1 AS OBJECT () NOT FINAL NOT INSTANTIABLE NOT PERSISTABLE;
CREATE OR REPLACE TYPE type2 AS OBJECT () FINAL INSTANTIABLE PERSISTABLE;
Type de table imbriquée¶
Ces instructions ne sont pas prises en charge par Snowflake. SnowConvert ne fait que les reconnaître, mais aucune traduction n’est proposée.
CREATE TYPE textdoc_typ AS OBJECT
( document_typ VARCHAR2(32)
, formatted_doc BLOB
) ;
/
CREATE TYPE textdoc_tab AS TABLE OF textdoc_typ;
/
Options de création du type de source¶
Ces options correspondent à des options personnalisées concernant l’accès et la requête du type.
CREATE TYPE type1 FORCE OID 'abc' SHARING = METADATA DEFAULT COLLATION schema1.collation ACCESSIBLE BY (schema1.unitaccesor) AS OBJECT ();
CREATE TYPE type2 FORCE OID 'abc' SHARING = NONE DEFAULT COLLATION collation ACCESSIBLE BY (PROCEDURE unitaccesor) AS OBJECT ();
CREATE TYPE type3 AUTHID CURRENT_USER AS OBJECT ();
CREATE TYPE type4 AUTHID DEFINER AS OBJECT ();
Solutions de contournement proposées¶
À propos de la définition des types¶
Pour la définition, la solution proposée consiste à créer un type de données semi-structurées pour imiter le type de données d’Oracle.
À propos de la fonction membre des types¶
Pour les fonctions membres contenant de la logique et DML, la solution de contournement proposée s’appuie sur des aides pour les traduire en procédures stockées.
Prise en charge actuelle de SnowConvert¶
La table suivante présente un résumé de la prise en charge actuellement fournie par l’outil SnowConvert. Tenez compte du fait que les traductions peuvent ne pas être définitives et qu’un travail supplémentaire peut être nécessaire.
Type Statement Element | Current recognition status | Current translation status | Has Known Workarounds |
---|---|---|---|
Object Type Definitions | Recognized. | Partially Translated. | Yes. |
Subtype Definitions | Recognized. | Not Translated. | No. |
Array Type Definitions | Recognized. | Not Translated. | Yes. |
Nested Table Definitions | Recognized. | Not Translated. | No. |
Member Function Definitions | Recognized. | Not Translated. | Yes. |
Problèmes connus¶
1. DML usages for Object Types are not being transformed¶
Pour l’instant, seules les définitions de DDL qui utilisent des types définis par l’utilisateur sont transformées en Variante. Cela signifie que toutes les insertions, mises à jour ou suppressions utilisant des types définis par l’utilisateur ne sont pas transformées et doivent l’être manuellement. Il n’y a pas d’EWI pour cela, mais il existe un élément de travail visant à ajouter cet EWI correspondant.
2. Create Type creation options are not supported¶
Actuellement, il n’existe pas de solution connue pour l’une ou l’autre des options de création, c’est pourquoi elles ne sont pas prises en compte lors de la définition du type.
EWIs connexes¶
Pas d’EWIs connexes.
Définition du type de tableau¶
SnowConvert ne reconnaît que ces définitions et, pour l’instant, n’en prend en charge aucune traduction. Cette page ne sert que de référence future pour les traductions.
Note
Certaines parties du code de sortie sont omises pour des raisons de clarté.
Description¶
Les types de tableau définissent une structure de tableau d’un type de données existant (y compris d’autres types personnalisés).
Pour la traduction des types de tableaux, la définition du type est remplacée par un type de données semi-structurées, puis elle est étendue à toutes les utilisations dans le code. Il s’agit de prendre la définition d’un type et de l’étendre au code d’origine.
CREATE TYPE <type name>
AS { VARRAY | [VARYING] ARRAY } ( <size limit> ) OF <data type>
Modèles d’échantillons de sources¶
Insertions pour l’utilisation du tableau¶
Les données suivantes seront insérées dans la table avant la requête de sélection. Notez que ces insertions doivent actuellement être migrées manuellement dans Snowflake.
Oracle¶
INSERT INTO customer_table_demo(customer_table_id, customer_data) VALUES
(1, phone_list_typ_demo('2000-0000', '4000-0000', '0000-0000'));
INSERT INTO customer_table_demo(customer_table_id, customer_data) VALUES
(1, phone_list_typ_demo('8000-2000', '0000-0000', '5000-0000'));
Snowflake¶
INSERT INTO customer_table_demo(customer_table_id, customer_data)
SELECT 1, ARRAY_CONSTRUCT('2000-0000', '4000-0000', '0000-0000');
INSERT INTO customer_table_demo(customer_table_id, customer_data)
SELECT 1, ARRAY_CONSTRUCT('8000-2000', '0000-0000', '5000-0000');
Utilisation du type de tableau¶
Oracle¶
CREATE TYPE phone_list_typ_demo AS VARRAY(3) OF VARCHAR2(25);
/
CREATE TABLE customer_table_demo (
customer_table_id INTEGER,
customer_data phone_list_typ_demo
);
/
SELECT * FROM customer_table_demo;
/
CUSTOMER_TABLE_ID|CUSTOMER_DATA |
-----------------+---------------------------------------+
1|[['2000-0000','4000-0000','0000-0000']]|
1|[['8000-2000','0000-0000','5000-0000']]|
Snowflake¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'VARYING ARRAY' NODE ***/!!!
CREATE TYPE phone_list_typ_demo AS VARRAY(3) OF VARCHAR2(25);
CREATE OR REPLACE TABLE customer_table_demo (
customer_table_id INTEGER,
customer_data VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-0062 - CUSTOM TYPE 'phone_list_typ_demo' USAGE CHANGED TO VARIANT ***/!!!
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
;
CREATE OR REPLACE VIEW PUBLIC.customer_table_demo_view
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "" }}'
AS
SELECT
customer_table_id,
customer_data
FROM
customer_table_demo;
SELECT * FROM
customer_table_demo_view;
CUSTOMER_TABLE_ID|CUSTOMER_DATA |
-----------------+---------------------------------------+
1|{['2000-0000','4000-0000','0000-0000']}|
1|{['8000-2000','0000-0000','5000-0000']}|
Problèmes connus¶
1. Create Type creation options are not supported¶
Actuellement, il n’existe pas de solution connue pour l’une ou l’autre des options de création, c’est pourquoi elles ne sont pas prises en compte lors de la définition du type.
2. Migrated code output is not functional¶
Les instructions sont modifiées inutilement, ce qui fait qu’elles ne sont plus fonctionnelles dans le code de sortie. Cette question sera abordée lorsqu’une transformation adéquate sera mise en place.
EWIs connexes¶
SSC-EWI-0062 : L’utilisation du type personnalisé a été modifiée en variante.
SSC-EWI-0073 : En attente de l’examen de l’équivalence fonctionnelle.
Définitions des fonctions membres¶
SnowConvert ne reconnaît toujours pas les fonctions membres de type ni les définitions de corps de type. Cette page ne sert que de référence future pour la traduction.
Note
Certaines parties du code de sortie sont omises pour des raisons de clarté.
Description¶
Comme les autres définitions de classe, Oracle TYPE peut mettre en œuvre des méthodes pour exposer des comportements basés sur ses attributs. MEMBER FUCTION sera transformée en procédures stockées de Snowflake, afin de maintenir l’équivalence fonctionnelle en raison des limites.
Comme les fonctions sont transformées en procédures, la référence de transformation pour PL/SQL s’applique également ici.
Modèles d’échantillons de sources¶
Insertions pour la fonction membre Simple square()¶
Les données suivantes seront insérées dans la table avant la requête de sélection. Notez que ces insertions doivent actuellement être migrées manuellement dans Snowflake.
Oracle¶
INSERT INTO table_member_function_demo(column1) VALUES
(type_member_function_demo(5));
Snowflake¶
INSERT INTO table_member_function_demo (column1)
SELECT OBJECT_CONSTRUCT('a1', 5);
Fonction simple square()¶
Oracle¶
-- TYPE DECLARATION
CREATE TYPE type_member_function_demo AS OBJECT (
a1 NUMBER,
MEMBER FUNCTION get_square RETURN NUMBER
);
/
-- TYPE BODY DECLARATION
CREATE TYPE BODY type_member_function_demo IS
MEMBER FUNCTION get_square
RETURN NUMBER
IS x NUMBER;
BEGIN
SELECT c.column1.a1*c.column1.a1 INTO x
FROM table_member_function_demo c;
RETURN (x);
END;
END;
/
-- TABLE
CREATE TABLE table_member_function_demo (column1 type_member_function_demo);
/
-- QUERYING DATA
SELECT
t.column1.get_square()
FROM
table_member_function_demo t;
/
T.COLUMN1.GET_SQUARE()|
----------------------+
25|
Snowflake¶
-- TYPE DECLARATION
!!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO VARIANT ***/!!!
CREATE TYPE type_member_function_demo AS OBJECT (
a1 NUMBER,
MEMBER FUNCTION get_square RETURN NUMBER
)
;
---- TYPE BODY DECLARATION
--!!!RESOLVE EWI!!! /*** SSC-EWI-OR0007 - CREATE TYPE WITHOUT BODY IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
--CREATE TYPE BODY type_member_function_demo IS
-- MEMBER FUNCTION get_square
-- RETURN NUMBER
-- IS x NUMBER;
-- BEGIN
-- SELECT c.column1.a1*c.column1.a1 INTO x
-- FROM table_member_function_demo c;
-- RETURN (x);
-- END;
--END
;
-- TABLE
CREATE OR REPLACE TABLE table_member_function_demo (column1 VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-0062 - CUSTOM TYPE 'type_member_function_demo' USAGE CHANGED TO VARIANT ***/!!!
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
;
CREATE OR REPLACE VIEW PUBLIC.table_member_function_demo_view
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "" }}'
AS
SELECT
column1:a1 :: NUMBER AS a1
FROM
table_member_function_demo;
-- QUERYING DATA
SELECT
t.column1.get_square() !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 't.column1.get_square' NODE ***/!!!
FROM
table_member_function_demo t;
GET_SQUARE()|
------------+
25|
Problèmes connus¶
Aucun problème connu.
EWIs connexes¶
SSC-EWI-0056 : Type de création non pris en charge.
SSC-EWI-0062 : L’utilisation du type personnalisé a été modifiée en variante.
SSC-EWI-0073 : En attente de l’examen de l’équivalence fonctionnelle.
SSC-EWI-OR0007 : Create Type n’est pas pris en charge par Snowflake
Définition du type de table imbriquée¶
SnowConvert ne reconnaît que ces définitions, ne prend en charge aucune traduction et il n’existe aucune solution de contournement connue.
Description
Les types de tables imbriquées définissent une structure de table intégrée à un type de données existant (y compris d’autres types personnalisés). Ils peuvent être utilisés comme une version plus puissante du type tableau.
Contrairement aux autres types, il n’existe toujours pas de solution de contournement connue ni de traduction possible.
CREATE TYPE <type name> AS TABLE OF <data type>
Sample Source Patterns
Utilisation du type de table imbriquée
Oracle
CREATE TYPE textdoc_typ AS OBJECT (
document_typ VARCHAR2(32),
formatted_doc BLOB
);
/
CREATE TYPE textdoc_tab AS TABLE OF textdoc_typ;
/
Snowflake
Snowflake
!!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO VARIANT ***/!!!
CREATE TYPE textdoc_typ AS OBJECT (
document_typ VARCHAR2(32),
formatted_doc BLOB
)
;
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'NESTED TABLE' NODE ***/!!!
CREATE TYPE textdoc_tab AS TABLE OF textdoc_typ;
Known Issues
1. Create Type creation options are not supported
Actuellement, il n’existe pas de solution connue pour les options de création ; c’est pourquoi elles ne sont pas prises en compte lors de la définition du type.
Related EWIs
SSC-EWI-0073 : En attente de l’examen de l’équivalence fonctionnelle
SSC-EWI-0056 : Type de création non pris en charge.
Définition du type d’objet
Note
SnowConvert prend en charge la traduction des définitions de type d’objet. Cependant, leur utilisation est encore en cours.
Note
Certaines parties du code de sortie sont omises pour des raisons de clarté.
Description¶
Les types d’objets définissent une structure de données similaire à un enregistrement, avec les avantages supplémentaires des définitions des fonctions membres. Cela signifie que leurs données peuvent être utilisées dans le cadre d’un comportement au sein du type.
Pour la traduction des types d’objets, la définition du type est remplacée par un type de données semi-structurées, puis elle est étendue à toutes les utilisations dans le code. Pour les tables, cela signifie remplacer la colonne par une variante et ajouter une vue afin que les sélections (ainsi que les vues) vers la table d’origine puissent continuer à fonctionner.
CREATE TYPE <type name> AS OBJECT
( [{<type column definition> | type method definition } , ...]);
Modèles d’échantillons de sources¶
Insertions pour l’utilisation de types simples¶
Les données suivantes seront insérées dans la table avant la requête de sélection. Notez que ces insertions doivent actuellement être migrées manuellement dans Snowflake.
Oracle¶
INSERT INTO customer_table_demo(customer_table_id, customer_data)
VALUES ( 1, customer_typ_demo(1, 'First Name 1', 'Last Name 1'));
INSERT INTO customer_table_demo(customer_table_id, customer_data)
VALUES ( 2, customer_typ_demo(2, 'First Name 2', 'Last Name 2'));
Snowflake¶
INSERT INTO customer_table_demo(customer_table_id, customer_data)
VALUES ( 1, customer_typ_demo(1, 'First Name 1', 'Last Name 1') !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'customer_typ_demo' NODE ***/!!!);
INSERT INTO customer_table_demo(customer_table_id, customer_data)
VALUES ( 2, customer_typ_demo(2, 'First Name 2', 'Last Name 2') !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'customer_typ_demo' NODE ***/!!!);
Utilisation du type simple¶
Oracle¶
CREATE TYPE customer_typ_demo AS OBJECT (
customer_id INTEGER,
cust_first_name VARCHAR2(20),
cust_last_name VARCHAR2(20)
);
CREATE TABLE customer_table_demo (
customer_table_id INTEGER,
customer_data customer_typ_demo
);
SELECT * FROM customer_table_demo;
CUSTOMER_TABLE_ID|CUSTOMER_DATA |
-----------------+------------------------------+
1|[1, First Name 1, Last Name 1]|
2|[2, First Name 2, Last Name 2]|
Snowflake¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO VARIANT ***/!!!
CREATE TYPE customer_typ_demo AS OBJECT (
customer_id INTEGER,
cust_first_name VARCHAR2(20),
cust_last_name VARCHAR2(20)
)
;
CREATE OR REPLACE TABLE customer_table_demo (
customer_table_id INTEGER,
customer_data VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-0062 - CUSTOM TYPE 'customer_typ_demo' USAGE CHANGED TO VARIANT ***/!!!
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
CREATE OR REPLACE VIEW PUBLIC.customer_table_demo_view
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "" }}'
AS
SELECT
customer_table_id,
customer_data:customer_id :: INTEGER AS customer_id,
customer_data:cust_first_name :: VARCHAR AS cust_first_name,
customer_data:cust_last_name :: VARCHAR AS cust_last_name
FROM
customer_table_demo;
SELECT * FROM
customer_table_demo_view;
CUSTOMER_TABLE_ID|CUST_ID|CUST_FIRST_NAME|CUST_LAST_NAME|
-----------------+-------+---------------+--------------+
1|1 |First Name 1 |Last Name 1 |
2|2 |First Name 2 |Last Name 2 |
Insertions pour l’utilisation de types imbriqués¶
Ces instructions doivent être placées entre la création de la table et l’instruction select pour tester la sortie.
Oracle¶
INSERT INTO customer_table_demo(customer_id, customer_data) values
(1, customer_typ_demo('Customer 1', email_typ_demo('email@domain.com')));
INSERT INTO customer_table_demo(customer_id, customer_data) values
(2, customer_typ_demo('Customer 2', email_typ_demo('email2@domain.com')));
Snowflake¶
INSERT INTO customer_table_demo(customer_id, customer_data) values
(1, customer_typ_demo('Customer 1', email_typ_demo('email@domain.com') !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'email_typ_demo' NODE ***/!!!) !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'customer_typ_demo' NODE ***/!!!);
INSERT INTO customer_table_demo(customer_id, customer_data) values
(2, customer_typ_demo('Customer 2', email_typ_demo('email2@domain.com') !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'email_typ_demo' NODE ***/!!!) !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'customer_typ_demo' NODE ***/!!!);
Utilisation des types imbriqués¶
Oracle¶
CREATE TYPE email_typ_demo AS OBJECT (email VARCHAR2(20));
CREATE TYPE customer_typ_demo AS OBJECT (
cust_name VARCHAR2(20),
cust_email email_typ_demo
);
CREATE TABLE customer_table_demo (
customer_id INTEGER,
customer_data customer_typ_demo
);
SELECT * FROM customer_table_demo;
CUSTOMER_ID|CUSTOMER_DATA |
-----------+---------------------------------+
1|[Customer 1, [email@domain.com]] |
2|[Customer 2, [email2@domain.com]]|
Snowflake¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO VARIANT ***/!!!
CREATE TYPE email_typ_demo AS OBJECT (email VARCHAR2(20))
;
!!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO VARIANT ***/!!!
CREATE TYPE customer_typ_demo AS OBJECT (
cust_name VARCHAR2(20),
cust_email email_typ_demo
)
;
CREATE OR REPLACE TABLE customer_table_demo (
customer_id INTEGER,
customer_data VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-0062 - CUSTOM TYPE 'customer_typ_demo' USAGE CHANGED TO VARIANT ***/!!!
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
CREATE OR REPLACE VIEW PUBLIC.customer_table_demo_view
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "" }}'
AS
SELECT
customer_id,
customer_data:cust_name :: VARCHAR AS cust_name,
customer_data:cust_email:email :: VARCHAR AS email
FROM
customer_table_demo;
SELECT * FROM
customer_table_demo_view;
CUSTOMER_ID|CUST_NAME |CUST_EMAIL |
-----------+----------+-----------------+
1|Customer 1|email@domain.com |
2|Customer 2|email2@domain.com|
Problèmes connus¶
1. Migrated code output is not the same¶
L’instruction view est modifiée inutilement, ce qui fait que la table n’a plus le même comportement dans le code de sortie. Un élément de travail a été mis en place pour corriger ce problème.
2. DML for User-defined Types is not being transformed¶
DML qui interagit avec des éléments contenant des types définis par l’utilisateur (comme une table) ne sont pas transformés. Un élément de travail a été mis en place pour corriger ce problème.
3. Create Type creation options are not supported¶
Actuellement, il n’existe pas de solution connue pour l’une ou l’autre des options de création, c’est pourquoi elles ne sont pas prises en compte lors de la définition du type.
EWIs connexes¶
SSC-EWI-0056 : Type de création non pris en charge.
SSC-EWI-0062 : L’utilisation du type personnalisé a été modifiée en variante.
SSC-EWI-0073 : En attente de l’examen de l’équivalence fonctionnelle.
Définition du sous-type¶
Comme il n’existe pas de solution de contournement connue, SnowConvert ne reconnaît que ces définitions et ne prend pas en charge leur traduction.
Description
Les sous-types définissent une structure de données similaire à un enregistrement, avec les avantages supplémentaires des définitions des fonctions membres. Cela signifie que leurs données peuvent être utilisées dans le cadre d’un comportement au sein du type. Contrairement aux types d’objets, les sous-types sont construits comme une extension d’un autre type existant.
En ce qui concerne les définitions de sous-types, il n’y a toujours pas de traduction, mais il pourrait y avoir un moyen de les réimplémenter en utilisant les définitions des types d’objets et en utilisant ensuite leur traduction respective.
CREATE TYPE <type name> UNDER <super type name>
( [{<type column definition> | type method definition } , ...]);
Sample Source Patterns
Sous-types d’un type d’objet
Oracle
CREATE TYPE person_t AS OBJECT (name VARCHAR2(100), ssn INTEGER)
NOT FINAL;
/
CREATE TYPE employee_t UNDER person_t
(department_id INTEGER, salary INTEGER)
NOT FINAL;
/
CREATE TYPE part_time_emp_t UNDER employee_t (num_hrs INTEGER);
/
Snowflake
!!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO VARIANT ***/!!!
CREATE TYPE person_t AS OBJECT (name VARCHAR2(100), ssn INTEGER)
NOT FINAL;
--!!!RESOLVE EWI!!! /*** SSC-EWI-OR0007 - CREATE TYPE SUBTYPE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
--CREATE TYPE employee_t UNDER person_t
-- (department_id INTEGER, salary INTEGER)
-- NOT FINAL
;
--!!!RESOLVE EWI!!! /*** SSC-EWI-OR0007 - CREATE TYPE SUBTYPE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
--CREATE TYPE part_time_emp_t UNDER employee_t (num_hrs INTEGER)
;
Known Issues
1. Create Type creation options are not supported
Actuellement, il n’existe pas de solution connue pour l’une ou l’autre des options de création, c’est pourquoi elles ne sont pas prises en compte lors de la définition du type.
Related EWIs
SSC-EWI-0056 : Type de création non pris en charge.
SSC-EWI-OR0007 : Create Type n’est pas pris en charge dans Snowflake.