SnowConvert: Oracle SQL-Anweisungen¶
Alter Table¶
Bemerkung
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
1. Description¶
Verwenden Sie die Anweisung ALTER TABLE, um die Definition einer nicht partitionierten Tabelle, einer partitionierten Tabelle, einer Tabellenpartition oder einer Tabellenunterpartition zu ändern. Bei Objekttabellen oder relationalen Tabellen mit Objektspalten verwenden Sie ALTER TABLE, um die Tabelle in die neueste Definition ihres referenzierten Typs zu konvertieren, nachdem der Typ geändert wurde (Oracle Dokumentation).
Oracle-Syntax
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 }
] ...
;
Bemerkung
Die Snowflake-Syntax können Sie in der folgenden Dokumentation nachlesen.
2. Sample Source Patterns¶
2.1. Alter Table mit Klauseln¶
Warnung
memoptimize_read_clause und memoptimize_read_clause sind in Snowflake nicht anwendbar und werden daher entfernt.
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));
Bemerkung
Nur einige column_clauses und constraint_clauses sind in Snowflake anwendbar. In Oracle erlaubt „Create Table“ die Änderung der Eigenschaften von erstellten Partitionen, aber in Snowflake sind diese Aktionen nicht erforderlich
2.2. Alter Table mit nicht unterstützen Fällen¶
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. ADDCONSTRAINT-Aktion¶
Die Aktion ADD CONSTRAINT hat eine Entsprechung in Snowflake, aber es kann nur eine Einschränkung pro ALTER TABLE-Anweisung hinzugefügt werden, so dass sie kommentiert wird, wenn die Anweisung zwei oder mehr Einschränkungen enthält.
Warnung
enable_disable_clause wurde entfernt, da sie in Snowflake nicht relevant ist.
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;
Bekannte Probleme¶
Einige Eigenschaften in den Tabellen müssen möglicherweise angepasst werden oder sind nicht anwendbar.
Create Database Link¶
Warnung
Derzeit wird die _ Create Database Link _-Anweisung nicht konvertiert, sondern geparst. Wenn Ihr Quellcode außerdemcreate database link
- Anweisungen enthält, werden diese im _ Bewertungsbericht berücksichtigt. _
Beispiel für einen Quellcode¶
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
Snowflake-Ausgabe¶
----** 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
Referenzen zu Datenbank-Links¶
Wenn Sie in Ihrem Eingabecode Objekte aus dem Datenbank-Link verwenden, behält der Ausgabecode den Namen dieser Objekte bei, aber der Name der Datenbankverknüpfung, die sie verwenden, wird entfernt.
Beispiel für einen Quellcode¶
-- 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;
Snowflake-Ausgabe¶
---- 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;
Zugehörige EWIs¶
[SSC-EWI-OR0123](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/oracleEWI. md#ssc-ewi-or0123): Db-Link-Verbindungen werden nicht unterstützt.
[SSC-FDM-0007](../../general/technical-documentation/issues-and-troubleshooting/functional-difference/generalFDM. md#ssc-fdm-0007): Element mit fehlenden Abhängigkeiten.
Drop Table¶
Bemerkung
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
Beschreibung¶
Eine DROP TABLE-Anweisung wird verwendet, um eine Tabelle zu entfernen. Diese Anweisung variiert ein wenig zwischen [Oracle ](https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/DROP-TABLE. html#GUID-39D89EDC-155D-4A24-837E-D45DDA757B45)und Snowflake. Bitte überprüfen Sie die jeweilige Dokumentation, um weitere Informationen zu den Unterschieden zu erhalten.
In Oracle lautet die Syntax für „Drop Table“:
DROP TABLE <table_name> [ CASCADE CONSTRAINTS ] [ PURGE ]
In Snowflake lautet die Syntax für „Drop Table“:
DROP TABLE [ IF EXISTS ] <table_name> [ CASCADE | RESTRICT ]
Der Hauptunterschied besteht darin, dass Snowflake keine gleichwertige Klausel für die PURGE-Klausel hat, da die Tabelle nicht dauerhaft aus dem System entfernt wird. Die CASCADE CONSTRAINTS- und die CASCADE-Klauseln sind jedoch gleich. Beide löschen die Tabelle, auch wenn Fremdschlüssel existieren, die auf diese Tabelle verweisen.
Beispiele¶
Sehen wir uns nun einige Codebeispiele an und wie der Code nach der Umwandlung aussehen würde. Jedes Beispiel verwendet eine andere Variante der DROP TABLE-Anweisung.
Beispiel 1:¶
In diesem Beispiel wird die DROP TABLE-Anweisung so einfach wie möglich verwendet.
Eingabecode:
DROP TABLE TEST_TABLE1;
Transformierter Code:
DROP TABLE TEST_TABLE1;
Beispiel 2:¶
Dieses Beispiel verwendet die DROP TABLE-Anweisung mit der PURGE-Klausel. Denken Sie daran, dass es in Snowflake keine Entsprechung für die PURGE-Klausel innerhalb einer DROP TABLE-Anweisung gibt.
Eingabecode:
DROP TABLE TEST_TABLE1 PURGE;
Transformierter Code:
DROP TABLE TEST_TABLE1;
Beispiel 3:¶
Dieses Beispiel verwendet die DROP TABLE-Anweisung mit der CASCADE CONSTRAINTS-Klausel.
Eingabecode:
DROP TABLE TEST_TABLE1 CASCADE CONSTRAINTS;
Transformierter Code:
DROP TABLE TEST_TABLE1 CASCADE;
In dem umgewandelten Code wird das Wort CONSTRAINTS aus der CASCADE CONSTRAINTS-Klausel entfernt.
Beispiel 4:¶
Dieses Beispiel verwendet die DROP TABLE-Anweisung mit den CASCADE CONSTRAINTS- und PURGE-Klauseln.
Eingabecode:
DROP TABLE TEST_TABLE1 CASCADE CONSTRAINTS PURGE;
Transformierter Code:
DROP TABLE TEST_TABLE1 CASCADE;
Wie gesehen, ändert sich der Code. Im neuen Snowflake-Code wird die Klausel PURGE entfernt und das Wort CONSTRAINTS wird auch aus der CASCADE-Klausel entfernt.
Funktionsäquivalenz¶
Führen Sie den folgenden Code aus, um die Funktionsäquivalenz zu prüfen. Beachten Sie, dass der einzige Teil, der nicht äquivalent ist, die PURGE-Klausel ist, die in Oracle die Tabelle vollständig aus dem System entfernt. Es gibt keine Entsprechung für Snowflake. In beiden Fällen wird die Tabelle gelöscht, auch wenn sie in einer anderen Tabelle referenziert wird.
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;
Zugehörige EWIs¶
Keine zugehörigen EWIs.
Create Index¶
Warnung
Derzeit wird die Anweisung _ Create Index _ nicht konvertiert, aber geparst. Wenn Ihr Quellcode außerdem Create Index
-Anweisungen enthält, werden diese im _ Bewertungsbericht_ berücksichtigt.
Beispiel für einen geparsten Code von Create Index:¶
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;
Bemerkung
Da Snowflake aus architektonischen Gründen keine Indizes unterstützt, wird SnowConvert den gesamten Code für die Erstellung von Indizes entfernen. Snowflake erstellt automatisch Mikropartitionen für jede Tabelle, die die Leistung von DML Operationen beschleunigen. Der Benutzer muss sich nicht um die Erstellung oder Verwaltung dieser Mikropartitionen kümmern.
Normalerweise reicht das aus, um eine außergewöhnlich gute Abfrageleistung zu erzielen. Es gibt jedoch Möglichkeiten, dies zu verbessern, indem Sie Gruppierungsschlüssel für Daten erstellen. Auf der offiziellen Seite von Snowflake finden Sie weitere Informationen über Mikropartitionen und Data Clustering.
Create Materialized Views¶
Beschreibung ¶
In Snowconvert werden materialisierte Ansichten in Oracle in dynamische Tabellen in Snowflake umgewandelt. Um dynamische Tabellen richtig zu konfigurieren, müssen zwei wesentliche Parameter definiert werden: TARGET_LAG und WAREHOUSE. Wenn diese Parameter in den Konfigurationsoptionen nicht angegeben werden, verwendet Snowconvert während der Konvertierung die voreingestellten Werte, wie im folgenden Beispiel gezeigt.
Für weitere Informationen über materialisierte Ansichten klicken Sie hier.
Einzelheiten zu den erforderlichen Parametern für dynamische Tabellen finden Sie hier.
Beispielhafte Quellcode-Muster¶
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;
Aktualisierungsmodi¶
Snowflakes dynamische Tabellen unterstützen ein Äquivalent zu den Aktualisierungsmodi der materialisierten Ansichten von Oracle. Die entsprechenden Modi sind wie folgt:
Oracle:
FAST: Aktualisiert nur die Zeilen, die sich geändert haben.
COMPLETE: Aktualisiert die gesamte materialisierte Ansicht.
FORCE: Verwendet FAST, wenn möglich, andernfalls COMPLETE.
Snowflake:
AUTO: Bestimmt automatisch die beste Aktualisierungsmethode.
FULL: Aktualisiert die gesamte Tabelle, was dem COMPLETE-Modus von Oracle entspricht.
INCREMENTAL: Aktualisiert nur die geänderten Zeilen.
Standardaktualisierungsmodus¶
Wenn Sie SnowConvert verwenden, ist der Standard-Aktualisierungsmodus der dynamischen Tabelle AUTO.
Modus Zuordnungen¶
Oracle FAST und FORCE -> Snowflake AUTO
Oracle COMPLETE -> Snowflake FULL
Weitere Einzelheiten finden Sie in der offiziellen Dokumentation zu Oracle Aktualisierungsmodi und Snowflake Aktualisierungsmodi.
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;
Bekannte Probleme¶
Zur Zeit sind keine Fehler bekannt.
Zugehörige EWIs¶
[ssc-fdm-0031.md](../../general/technical-documentation/issues-and-troubleshooting/functional-difference/generalFDM. md#ssc-fdm-0031 „mention“): Standardmäßige Einstellung der erforderlichen Parameter für dynamische Tabellen
Create Sequence¶
Sehen wir uns zunächst ein Codebeispiel an und wie es nach der Umwandlung aussehen würde.
Eingabecode:¶
CREATE SEQUENCE SequenceSample
START WITH 1000
INCREMENT BY 1
NOCACHE
NOCYCLE;
Ausgabecode:¶
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"}}';
Die erste Änderung, die vorgenommen wird, besteht darin, das Schema oder Datawarehouse auf den Namen der Sequenz anzuwenden. Die zweite Transformation besteht darin, einige Elemente zu entfernen und sie als Kommentare hinzuzufügen, da Orakel einige Elemente in Create Sequence hat, die in Snowflake nicht unterstützt werden.
In Oracle werden nach dem Namen der Sequenz die folgenden Elemente NICHT kommentiert
START WITH 1000
INCREMENT BY 1
Wenn das Element nicht dazu gehört, wird es kommentiert und als Warnung vor Create Sequence hinzugefügt, wie im Beispiel.
Die folgenden Elemente werden entfernt
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: Die Snowflake-Grammatik ist die gleiche wie die Oracle-Grammatik.
CURRVAL: Snowflake hat kein Äquivalent, also erfolgt eine Konvertierung in eine Stub-Funktion. Sehen Sie sich diesen Link an, um den Ansatz von Snowflake zu verstehen.
Eingabecode:¶
select seq1.nextval from dual;
select seq1.currval from dual;
Ausgabecode:¶
select seq1.nextval from dual;
select
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0069 - THE SEQUENCE CURRVAL PROPERTY IS NOT SUPPORTED IN SNOWFLAKE. ***/!!! seq1.currval from dual;
Sequenz STARTWITH¶
Der Wert der START WITH
-Anweisung kann den von Snowflake erlaubten Höchstwert überschreiten. Snowflake sagt zu diesem Startwert: Legt den ersten Wert fest, der von der Sequenz zurückgegeben wird. Unterstützt werden alle Werte, die durch eine 64-Bit-Zweierkomplement-Ganzzahl dargestellt werden können (von -2^63
bis 2^63-1
)_. Demnach ist der maximal zulässige Wert 9223372036854775807 für positive Zahlen und 9223372036854775808 für negative Zahlen.
Beispielcode¶
Eingabecode:¶
CREATE SEQUENCE SEQUENCE1
START WITH 9223372036854775808;
CREATE SEQUENCE SEQUENCE2
START WITH -9223372036854775809;
Ausgabecode:¶
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"}}';
Zugehörige EWIs¶
[SSC-EWI-OR0069](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/oracleEWI. md#ssc-ewi-or0069): Die Eigenschaft CURRVAL der Sequenz wird in Snowflake nicht unterstützt.
[SSC-EWI-OR0068](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/oracleEWI. md#ssc-ewi-or0068): Der Sequenzstartwert überschreitet den von Snowflake erlaubten Höchstwert.
Alter Session¶
Alter Session¶
Alter Session hat eine Entsprechung in Snowflake und einige der Variablen sind Snowflake-Variablen zugeordnet. Wenn eine Permutation von Alter Session nicht unterstützt wird, wird der Knoten kommentiert und eine Warnung hinzugefügt.
Oracle-Code:¶
alter session set nls_date_format = 'DD-MM-YYYY';
Snowflake-Code:¶
ALTER SESSION SET DATE_INPUT_FORMAT = 'DD-MM-YYYY' DATE_OUTPUT_FORMAT = 'DD-MM-YYYY';
Referenz Sitzungsparameter¶
Bemerkung
Die Sitzungsparameter, die nicht in der Tabelle erscheinen, werden derzeit nicht umgewandelt.
Sitzungsparameter |
Snowflake-Transformation |
---|---|
NLS_DATE_FORMAT |
DATE_INPUT_FORMAT und DATE_OUTPUT_FORMAT |
NLS_NUMERIC_CHARACTERS |
NOT SUPPORTED |
Bekannte Probleme ¶
Es wurden keine Probleme gefunden.
Zugehörige EWIs ¶
Keine zugehörigen EWIs.
Create Synonym¶
Bemerkung
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
Create Synonym¶
Synonyme werden in Snowflake nicht unterstützt. Die Verweise auf die Synonyme werden für das ursprüngliche Objekt geändert.
Eingabecode:¶
CREATE OR REPLACE SYNONYM B.TABLITA_SYNONYM FOR TABLITA;
Ausgabecode:¶
----** 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
;
Beispiel 1: Synonym, das sich auf eine Tabelle bezieht.¶
Oracle-Quellcode:
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;
Snowflake hat den Code migriert: Sie werden feststellen, dass SELECT
ursprünglich auf ein Synonym verweist, jetzt aber auf die Tabelle, die auf das Synonym verweist.
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;
Beispiel 2: Synonym, das sich auf ein anderes Synonym bezieht.¶
Oracle-Quellcode:
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);
Von Snowflake migrierter Code: Sie werden feststellen, dass sich SELECT
, UPDATE
, INSERT
ursprünglich auf ein Synonym bezog und jetzt auf das atomare Objekt, das eine Tabelle ist.
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);
Beispiel 3: Synonym, das sich auf eine Ansicht bezieht¶
Oracle-Quellcode:
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;
Von Snowflake migrierter Code: Sie werden feststellen, dass SELECT
sich ursprünglich auf ein Synonym bezog und jetzt auf die atomaren Objekte, die eine Ansicht sind.
----** 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;
Die Transformation von Synonymen kann in den [UI-Einstellungen] aktiviert oder deaktiviert werden(../../general/getting-started/running-snowconvert/conversion/general-conversion-settings.md).
Zugehörige EWIs¶
[SSC-FDM-0001](../../general/technical-documentation/issues-and-troubleshooting/functional-difference/generalFDM. md#ssc-fdm-0001): Ansichten, die alle Spalten aus einer einzigen Tabelle auswählen, sind in Snowflake nicht erforderlich.
[SSC-FDM-0006](../../general/technical-documentation/issues-and-troubleshooting/functional-difference/generalFDM. md#ssc-fdm-0006): Zahlentyp-Spalte verhält sich in Snowflake möglicherweise nicht ähnlich.
[SSC-FDM-OR0005](../../general/technical-documentation/issues-and-troubleshooting/functional-difference/oracleFDM. md#ssc-fdm-or0005): Synonyme werden in Snowflake nicht unterstützt, aber Verweise auf dieses Synonym wurden durch den ursprünglichen Objektnamen geändert.
Create Table¶
1. Description¶
In Oracle wird die CREATE TABLE-Anweisung verwendet, um eine der folgenden Arten von Tabellen zu erstellen: eine relationale Tabelle, die die Grundstruktur für die Speicherung von Benutzerdaten darstellt, oder eine Objekttabelle, die einen Objekttyp für eine Spaltendefinition verwendet. (Oracle-Dokumentation)
Oracle-Syntax
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 ] ;
Snowflake-Syntax
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>' , ... ] ) ]
Bemerkung
Weitere Informationen zu Snowflake finden Sie in der folgenden Dokumentation.
2. Sample Source Patterns¶
2.1. Physische und tabellarische Eigenschaften¶
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"}}'
;
Bemerkung
Tabelleneigenschaften werden entfernt, da sie nach der Migration in Snowflake nicht mehr benötigt werden.
2.2. Einschränkungen und Einschränkungsstatus¶
Die folgenden Einschränkungen werden auskommentiert:
CHECK
-Einschränkung
Bemerkung
Die Einschränkung USING INDEX
wird bei der Konvertierung vollständig aus dem Ausgabecode entfernt.
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"}}'
;
Andererseits, aber auf die gleiche Art und Weise, wenn Sie eine beliebige Einschränkung nach einer NOT NULL-Einschränkung wie folgt haben:
RELY
NO RELY
RELY ENABLE
RELY DISABLE
VALIDATE
NOVALIDATE
Diese werden ebenfalls auskommentiert.
Bemerkung
Der ENABLE-Status wird bei der Konvertierung vollständig aus dem Ausgabecode entfernt. Im Falle des DISABLE-Status wird er gleichzeitig mit der Einschränkung NOT NULL entfernt.
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. Fremdschlüssel¶
Wenn es eine Tabelle mit einer NUMBER-Spalte ohne Genauigkeit oder Skalierung gibt und eine andere Tabelle mit einer NUMBER(*, 0)-Spalte, die auf die zuvor erwähnte NUMBER-Spalte verweist, kommentieren wir diesen Fremdschlüssel aus.
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. Virtuelle Spalte¶
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. Identitätsspalte¶
Für Identitätsspalten wird eine Sequenz erstellt und der Spalte zugewiesen.
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. CLOB- und BLOB-Spaltendeklaration¶
Spalten, die als CLOB oder BLOB deklariert sind, werden in VARCHAR geändert.
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. Name der Einschränkung¶
Warnung
Der Name der Einschränkung wird aus dem Code entfernt, da er in Snowflake nicht anwendbar ist.
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. Standardspalten mit Zeiten¶
Die Spalten, die als Datumstypen deklariert sind, werden so umgewandelt, dass sie mit dem spezifischen Datumstyp übereinstimmen.
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 ASSubQuery¶
Die folgenden Eigenschaften und Klauseln werden bei der Erstellung einer Tabelle über AS SubQuery
in Snowflake nicht unterstützt.
[ 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;
Bekannte Probleme¶
Einige Eigenschaften in den Tabellen müssen möglicherweise angepasst oder kommentiert werden, weil die Verhaltensweise in Snowflake anders ist.
Zugehörige EWIs¶
[SSC-EWI-0035](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0035): Check-Anweisung wird nicht unterstützt.
[SSC-FDM-0006](../../general/technical-documentation/issues-and-troubleshooting/functional-difference/generalFDM. md#ssc-fdm-0006): Zahlentyp-Spalte verhält sich in Snowflake möglicherweise nicht ähnlich.
[SSC-FDM-0019](../../general/technical-documentation/issues-and-troubleshooting/functional-difference/generalFDM. md#ssc-fdm-0019): Die semantischen Informationen konnten nicht geladen werden.
[SSC-FDM-OR0042](../../general/technical-documentation/issues-and-troubleshooting/functional-difference/oracleFDM. md#ssc-fdm-or0042): In Zeitstempel umgewandelter Datumstyp zeigt eine andere Verhaltensweise
[SSC-FDM-OR0006](../../general/technical-documentation/issues-and-troubleshooting/functional-difference/oracleFDM. md#ssc-fdm-or0006): Einschränkung aus der Inline-Einschränkung „not null“ entfernt.
Create View¶
Bemerkung
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
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;
Die folgenden Klauseln für Create View werden entfernt:
No Force/Force
EDITION-Klausel
SHARING-Klausel
Standardsortierung
BEQUEATH-Klausel
CONTAINER-Klausel
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 wird von SnowConvert noch nicht unterstützt.
Drop View¶
Die CASCADE CONSTRAINT-Klausel wird noch nicht unterstützt.
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 ***/!!!;
Zugehörige EWIs¶
[SSC-EWI-0073](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0073): Überprüfung der Funktionsäquivalenz ausstehend.
Create Type¶
Allgemeine Beschreibung¶
Eines der wichtigsten Features der Oracle-Datenbank-Engine ist ein objektorientierter Ansatz. PL/SQL bietet Möglichkeiten, die über andere relationale Datenbanken in Form von OOP hinausgehen, indem es Java-ähnliche Anweisungen in Form von Paketen, Funktionen, Tabellen und Typen verwendet. Dieses Dokument befasst sich mit dem letzten Punkt und damit, wie SnowConvert ihn löst, ohne die Funktionalität zu beeinträchtigen.
Oracle unterstützt die folgenden Spezifikationen:
Abstrakter Datentyp (ADT) (inklusive eines SQLJ-Objekttyps).
Eigenständiger variabler Array (varray)-Typ.
Eigenständiger verschachtelter Tabellentyp.
Unvollständiger Objekttyp.
All dies entspricht den Informationen in der Dokumentation zur Oracle CREATE TYPE-Anweisung
CREATE [ OR REPLACE ] [ EDITIONABLE | NONEDITIONAL ] TYPE <type name>
[ <type source creation options> ]
[<type definition>]
[ <type properties> ]
Einschränkungen¶
Laut der Online-Dokumentation Nicht unterstützte Datentypen unterstützt Snowflake keine benutzerdefinierten Datentypen, aber es unterstützt semistrukturierte Datentypen, mit denen Sie die hierarchieähnliche Struktur der meisten benutzerdefinierten Typen nachahmen können. Aus diesem Grund gibt es mehrere Features, für die es keine Umgehungsmöglichkeit gibt.
Nachfolgend sind die Features der benutzerdefinierten Typen aufgeführt, für die NO eine Umgehungsmöglichkeit vorschlägt:
Untertypen: Typenhierarchie¶
Diese Anweisungen werden in Snowflake nicht unterstützt. SnowConvert erkennt sie nur an, aber es wird keine Übersetzung angeboten.
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);
/
Typeneigenschaften¶
Diese beziehen sich auf die Optionen, die normalerweise bei der Verwendung von OOP in PL/SQL verwendet werden: Persistable, Instantiable und Final.
CREATE OR REPLACE TYPE type1 AS OBJECT () NOT FINAL NOT INSTANTIABLE NOT PERSISTABLE;
CREATE OR REPLACE TYPE type2 AS OBJECT () FINAL INSTANTIABLE PERSISTABLE;
Verschachtelter Tabellentyp¶
Diese Anweisungen werden in Snowflake nicht unterstützt. SnowConvert erkennt sie nur an, aber es wird keine Übersetzung angeboten.
CREATE TYPE textdoc_typ AS OBJECT
( document_typ VARCHAR2(32)
, formatted_doc BLOB
) ;
/
CREATE TYPE textdoc_tab AS TABLE OF textdoc_typ;
/
Optionen für die Erstellung von Typquellen¶
Diese Optionen stehen für benutzerdefinierte Optionen für den Zugriff und die Abfrage des Typs.
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 ();
Vorgeschlagene Umgehungsmöglichkeiten¶
Über Typendefinition¶
Für die Definition wird vorgeschlagen, einen semistrukturierten Datentyp zu erstellen, der den Datentyp von Oracle nachahmt.
Über Typ-Member-Funktionen¶
Für Member-Funktionen, die Logik und DML enthalten, stützt sich die vorgeschlagene Umgehungsmöglichkeit auf Hilfsfunktionen, die diese in gespeicherte Prozeduren übersetzen.
Aktuelle SnowConvert-Unterstützung¶
Die nächste Tabelle zeigt eine Übersicht über die aktuelle Unterstützung durch das SnowConvert-Tool. Bitte beachten Sie, dass die Übersetzungen noch nicht endgültig sind und noch weitere Arbeiten erforderlich sein können.
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. |
Bekannte Probleme¶
1. DML usages for Object Types are not being transformed¶
Ab sofort werden nur noch DDL-Definitionen, die benutzerdefinierte Typen verwenden, in Varianten umgewandelt. Das bedeutet, dass alle Einfügungen, Aktualisierungen oder Löschungen, die benutzerdefinierte Typen verwenden, nicht transformiert werden und manuell transformiert werden müssen. Es gibt keine EWI dafür, aber es gibt ein Work-Element, um dies entsprechend EWI hinzuzufügen.
2. Create Type creation options are not supported¶
Derzeit gibt es für keine der Erstellungsoptionen eine bekannte Umgehungsmöglichkeit, daher werden sie bei der Definition des Typs nicht berücksichtigt.
Zugehörige EWIs¶
Keine zugehörigen EWIs.
Definition des Array-Typs¶
SnowConvert erkennt nur diese Definitionen an und unterstützt im Moment keine Übersetzung für sie. Diese Seite dient nur als zukünftige Referenz für Übersetzungen.
Bemerkung
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
Beschreibung¶
Array-Typen definieren eine Array-Struktur eines bereits vorhandenen Datentyps (einschließlich anderer benutzerdefinierter Typen).
Bei der Übersetzung von Array-Typen wird die Typdefinition durch einen semistrukturierten Datentyp ersetzt und dann bei jeder Verwendung im Code erweitert. Das bedeutet, dass Sie die Definition eines Typs nehmen und sie dann auf den ursprünglichen Code erweitern.
CREATE TYPE <type name>
AS { VARRAY | [VARYING] ARRAY } ( <size limit> ) OF <data type>
Beispielhafte Quellcode-Muster¶
Einfügungen für die Verwendung des Arrays¶
Die nächsten Daten werden in die Tabelle eingefügt, bevor die Abfrage des Select erfolgt. Bitte beachten Sie, dass diese Inserts derzeit manuell in Snowflake migriert werden müssen.
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');
Verwendung des Array-Typs¶
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']}|
Bekannte Probleme¶
1. Create Type creation options are not supported¶
Derzeit gibt es für keine der Erstellungsoptionen eine bekannte Umgehungsmöglichkeit, daher werden sie bei der Definition des Typs nicht berücksichtigt.
2. Migrated code output is not functional¶
Die Anweisungen werden unnötigerweise geändert, so dass sie im Ausgabecode nicht mehr funktional sind. Dies wird in Angriff genommen werden, wenn eine angemessene Transformation für sie erfolgt ist.
Zugehörige EWIs¶
[SSC-EWI-0062](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0062): Benutzerdefinierte Typverwendung auf Variante geändert.
[SSC-EWI-0073](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0073): Überprüfung der Funktionsäquivalenz ausstehend.
Definitionen der Member-Funktionen¶
SnowConvert erkennt immer noch keine Typ-Member-Funktionen oder Typ-Body-Definitionen. Diese Seite dient nur als zukünftige Referenz für die Übersetzung.
Bemerkung
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
Beschreibung¶
Wie andere Klassendefinitionen kann Oracle TYPE-Methoden implementieren, um Verhaltensweisen auf der Grundlage seiner Attribute zu zeigen. MEMBER FUCTION werden in gespeicherte Prozeduren von Snowflake umgewandelt, um aufgrund von Beschränkungen die Funktionsäquivalenz zu gewährleisten.
Da Funktionen in Prozeduren umgewandelt werden, gilt auch hier die Transformationsreferenz für PL/SQL.
Beispielhafte Quellcode-Muster¶
Einfügungen für einfache Square()-Member-Funktionen¶
Die nächsten Daten werden in die Tabelle eingefügt, bevor die Abfrage des Select erfolgt. Bitte beachten Sie, dass diese Inserts derzeit manuell in Snowflake migriert werden müssen.
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);
Einfache Square()-Member-Funktion¶
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|
Bekannte Probleme¶
Keine bekannten Probleme.
Zugehörige EWIs¶
[SSC-EWI-0056](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0056): Typ erstellen wird nicht unterstützt.
[SSC-EWI-0062](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0062): Benutzerdefinierte Typverwendung auf Variante geändert.
[SSC-EWI-0073](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0073): Überprüfung der Funktionsäquivalenz ausstehend.
[SSC-EWI-OR0007](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/oracleEWI. md#ssc-ewi-or0007): Create Type wird in Snowflake nicht unterstützt
Typdefinition für verschachtelte Tabellen¶
SnowConvert erkennt nur diese Definitionen, unterstützt keine Übersetzung und es gibt keine bekannte Umgehungsmöglichkeit für sie.
Description
Verschachtelte Tabellentypen definieren eine eingebettete Tabellenstruktur eines bereits vorhandenen Datentyps (einschließlich anderer benutzerdefinierter Typen). Sie können als eine leistungsfähigere Version des Array-Typs verwendet werden.
Im Gegensatz zu den anderen Typen gibt es für diese noch keine bekannte Umgehungsmöglichkeit oder eine mögliche Übersetzung.
CREATE TYPE <type name> AS TABLE OF <data type>
Sample Source Patterns
Verwendung des verschachtelten Tabellentyps
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
Derzeit gibt es für keine der Erstellungsoptionen eine bekannte Umgehungsmöglichkeit, daher werden sie bei der Definition des Typs nicht berücksichtigt.
Related EWIs
[SSC-EWI-0073](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0073): Überprüfung der Funktionsäquivalenz ausstehend
[SSC-EWI-0056](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0056): Typ erstellen wird nicht unterstützt.
Definition des Objekttyps
Bemerkung
SnowConvert unterstützt selbst eine Übersetzung für Objekttyp-Definitionen. Ihre Verwendung ist jedoch noch in der Entwicklung begriffen.
Bemerkung
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
Beschreibung¶
Objekttypen definieren eine Datenstruktur ähnlich wie ein Datensatz, mit den zusätzlichen Vorteilen der Definitionen von Mitgliedsfunktionen. Das bedeutet, dass ihre Daten für eine bestimmte Verhaltensweise innerhalb des Typs verwendet werden können.
Bei der Übersetzung von Objekttypen wird die Typdefinition durch einen semistrukturierten Datentyp ersetzt, der dann bei jeder Verwendung im Code erweitert wird. Bei Tabellen bedeutet dies, dass Sie die Spalte für eine Variante ersetzen und eine Ansicht hinzufügen, damit Selects (und auch Views) auf die ursprüngliche Tabelle weiterhin funktionieren.
CREATE TYPE <type name> AS OBJECT
( [{<type column definition> | type method definition } , ...]);
Beispielhafte Quellcode-Muster¶
Einfügungen für die Verwendung von einfachen Typen¶
Die nächsten Daten werden in die Tabelle eingefügt, bevor die Abfrage des Select erfolgt. Bitte beachten Sie, dass diese Inserts derzeit manuell in Snowflake migriert werden müssen.
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 ***/!!!);
Verwendung von einfachen Typen¶
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 |
Einfügungen für die Verwendung von verschachtelten Typen¶
Diese Anweisungen müssen zwischen der Tabellenerstellung und der SELECT-Anweisung eingefügt werden, um die Ausgabe zu testen.
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 ***/!!!);
Verwendung des verschachtelten Typs¶
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|
Bekannte Probleme¶
1. Migrated code output is not the same¶
Die VIEW-Anweisung wird unnötigerweise geändert, so dass die Tabelle im Ausgabecode nicht mehr dieselbe Verhaltensweise zeigt. Es gibt ein Work-Element zur Behebung dieses Problems.
2. DML for User-defined Types is not being transformed¶
DML die mit Elementen interagieren, die benutzerdefinierte Typen enthalten (wie eine Tabelle), werden nicht umgewandelt. Es gibt ein Work-Element, um dies in Zukunft zu implementieren.
3. Create Type creation options are not supported¶
Derzeit gibt es für keine der Erstellungsoptionen eine bekannte Umgehungsmöglichkeit, daher werden sie bei der Definition des Typs nicht berücksichtigt.
Zugehörige EWIs¶
[SSC-EWI-0056](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0056): Typ erstellen wird nicht unterstützt.
[SSC-EWI-0062](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0062): Benutzerdefinierte Typverwendung auf Variante geändert.
[SSC-EWI-0073](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0073): Überprüfung der Funktionsäquivalenz ausstehend.
Definition von Subtypen¶
Da es keine bekannten Umgehungsmöglichkeiten gibt, erkennt SnowConvert nur diese Definitionen und unterstützt keine Übersetzung für sie.
Description
Subtypen definieren eine Datenstruktur ähnlich wie ein Datensatz, mit den zusätzlichen Vorteilen der Definitionen von Member-Funktionen. Das bedeutet, dass ihre Daten für eine bestimmte Verhaltensweise innerhalb des Typs verwendet werden können. Anders als Objekttypen werden Subtypen als Erweiterung eines anderen bestehenden Typs erstellt.
Für Subtyp-Definitionen gibt es immer noch keine Übersetzung, aber es könnte eine Möglichkeit geben, sie mit Objekttyp-Definitionen neu zu implementieren und dann die entsprechende Übersetzung zu verwenden.
CREATE TYPE <type name> UNDER <super type name>
( [{<type column definition> | type method definition } , ...]);
Sample Source Patterns
Subtypen unter einem Objekttyp
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
Derzeit gibt es für keine der Erstellungsoptionen eine bekannte Umgehungsmöglichkeit, daher werden sie bei der Definition des Typs nicht berücksichtigt.
Related EWIs
[SSC-EWI-0056](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0056): Typ erstellen wird nicht unterstützt.
[SSC-EWI-OR0007](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/oracleEWI. md#ssc-ewi-or0007): Create Type wird in Snowflake nicht unterstützt.