SnowConvert AI – Bericht zu Codeeinheiten auf oberster Ebene

Was ist eine Codeeinheit der obersten Ebene?

Eine Codeeinheit ist, wie der Name schon sagt, das kleinste eigenständige ausführbare Element. In den meisten Fällen handelt es sich dabei um Anweisungen, aber sie umfassen auch Skriptdateien, da diese als einzelnes Element ausgeführt werden.

Einige Codeeinheiten können innerhalb anderer Codeeinheiten verschachtelt werden. Wenn es in einer Hierarchie von Einheiten keine andere Codeeinheit über ihr gibt, nennt man sie Codeeinheit der obersten Ebene.

Was ist eine Codeeinheit außerhalb des gültigen Bereichs?

Codeeinheiten auf oberster Ebene außerhalb des gültigen Bereichs sind Codeeinheiten, die außerhalb des Konvertierungsbereichs von SnowConvert AI liegen. Deshalb werden diese Codeeinheiten bei der Berechnung der Konvertierungsrate nicht berücksichtigt. Keine dieser Codeeinheiten hat eine Konvertierungsrate (wird als N/A angezeigt).

Wenn der Eingabecode nur Codeeinheiten enthält, die nicht in den Geltungsbereich fallen, beträgt die Konvertierungsrate der gesamten Migration 0 % der Codezeilen.

Der folgende CREATE TRIGGER gilt als Codeeinheit außerhalb des gültigen Bereichs.

CREATE OR REPLACE TRIGGER my_trigger
    AFTER 
    UPDATE
    ON my_table
    FOR EACH ROW
BEGIN
   NULL;
END;
Copy

Beispiele für Codeeinheiten der obersten Ebene

Im folgenden Abschnitt sehen wir einige Beispiele für Codeeinheiten der obersten Ebene.

Abfragen

Im folgenden Beispiel haben wir hier eine einzelne SELECT-Anweisung. Diese Anweisung ist eine einzelne Codeeinheit der obersten Ebene.

SELECT * FROM table1;
Copy

In diesem Beispiel haben wir eine verschachtelte SELECT-Anweisung, die in einer anderen SELECT-Anweisung verschachtelt ist. Die gesamte Abfrage zählt als eine einzelne Codeeinheit der obersten Ebene.

SELECT * FROM (SELECT * FROM table1);
Copy

Objekte

Objekte, die mit einer DDL erstellt wurden, zählen als einzelne Codeeinheit der obersten Ebene, auch wenn sie andere Codeeinheiten enthalten.

Die folgende Anweisung erstellt eine Ansicht mit einer Abfrage. In diesem Fall zählt die gesamte CREATE VIEW als einzelne Codeeinheit der obersten Ebene.

CREATE VIEW view1 AS SELECT * FROM table1;
Copy

Die folgende CREATE PROCEDURE-Anweisung zählt als einzelne Codeeinheit der obersten Ebene, auch wenn sie mehrere Anweisungen enthält.

CREATE PROCEDURE procedure1
AS
BEGIN
    DELETE FROM table1;
END;
Copy

Befehle

Eigenständige Befehle in einer SQL-Datei werden als Codeeinheiten der obersten Ebene betrachtet.

Eine COMMIT-Anweisung zählt als einzelne Codeeinheit der obersten Ebene.

COMMIT;
Copy

Paket-Bodys in Oracle

Ein Paket kann mehrere Elemente innerhalb seines Bodys definieren. Der Paket-Body wird als Codeeinheit der obersten Ebene betrachtet, da diese Elemente nicht einzeln erstellt werden können, ohne den gesamten Paket-Body zu erstellen. Elemente oder Codeeinheiten innerhalb eines Paket-Bodys zählen nicht als Codeeinheiten der obersten Ebene.

Der folgende Code gilt als einzelne CREATE PACKAGE BODY-Codeeinheit.

CREATE PACKAGE package_body1 IS
    FUNCTION function1
    RETURN VARCHAR
    IS
    BEGIN
        RETURN 'HELLO'';
    END;
END;
Copy

Teradata-Skriptdateien

Teradata-Skriptdateien wie BTEQ oder TPUMP werden als eigenständige Codeeinheiten ausgeführt. Aus diesem Grund wird die gesamte Datei als einzelne Codeeinheit der obersten Ebene betrachtet. Andere mögliche Codeeinheiten innerhalb dieser Dateien zählen nicht als Codeeinheiten der obersten Ebene.

Die folgende BTEQ-Skriptdatei wird als einzelne BTEQ-Codeeinheit der obersten Ebene betrachtet.

.LOGON e/fml,notebook
.COMPILE FILE = example.spl;
COMMIT;
CALL samplesp1 (8888, pAmount);
.LOGOFF
Copy

Transact-SQL-Batches mit GOTO

Jede Anweisung von Transact-SQL kann eigenständig ausgeführt werden. In den meisten Fällen wird jede dieser Anweisungen als Codeeinheit der obersten Ebene betrachtet. Wenn es jedoch einen Stapel gibt, der eine GOTO-Anweisung zu einem LABEL innerhalb desselben Batchs enthält, können die Anweisungen des Batchs nicht unabhängig voneinander ausgeführt werden, ohne sicherzustellen, dass sie richtig funktionieren. Aus diesem Grund werden Anweisungen, die sich in einem Batch mit einer GOTO-Anweisung befinden, nicht als Codeeinheiten der obersten Ebene gezählt, sondern nur der Batch.

Das folgende Codebeispiel wird als eine einzelne GOTO/LABEL-Codeeinheit betrachtet:

DECLARE @Counter int;  
SET @Counter = 1;  
WHILE @Counter < 10  
BEGIN   
    SELECT @Counter  
    SET @Counter = @Counter + 1  
    IF @Counter = 4 GOTO Branch_One
    IF @Counter = 5 GOTO Branch_Two  
END  
Branch_One:  
    SELECT 'Jumping To Branch One.'  
    GOTO Branch_Three;
Branch_Two:  
    SELECT 'Jumping To Branch Two.'  
Branch_Three:  
    SELECT 'Jumping To Branch Three.';
GO
Copy

Wie wird die Codeeinheitmethodik in anderen Berichten dargestellt?

Die Codeeinheitmethodik ist auch in anderen Berichten vertreten. In diesem Abschnitt wird erklärt, wie diese Werte angezeigt werden oder wie sie mit anderen Berichten zusammenhängen.

Problembericht

issues-report.md

Jede Zeile des Problemberichts enthält einige Informationen über die Codeeinheit, die von dem Problem betroffen ist. Die Spalten, die sich auf Codeeinheiten beziehen, sind die folgenden:

  • Code Unit Database: Dies ist die Datenbank der Codeeinheit der obersten Ebene, in der das Problem gefunden wurde. Sie gilt nur für Codeeinheiten, die Objekte sind.

  • Code Unit Schema: Dies ist das Schema der Codeeinheit der obersten Ebene, in der das Problem gefunden wurde. Sie gilt nur für Codeeinheiten, die Objekte sind.

  • Code Unit Package: Dies ist das Paket der Codeeinheit der obersten Ebene, in der das Problem gefunden wurde. Sie gilt nur für Codeeinheiten, die Objekte sind.

  • Code Unit Name: Dies ist der Name der Codeeinheit der obersten Ebene, in der das Problem gefunden wurde. Er gilt nur für benannte Codeeinheiten wie Objekte. Dieser Name ist nicht durch Datenbank, Schema oder Paket qualifiziert.

  • Code Unit ID: Dies ist die ID der Codeeinheit der obersten Ebene, in der das Problem gefunden wurde. Bei diesem Namen ist der Name qualifiziert, und bei Codeeinheiten mit wiederholten Namen wird eine Nummer hinzugefügt.

  • Code Unit: Dies ist der Typ der Codeeinheit der obersten Ebene, in der das Problem gefunden wurde.

  • Code Unit Size: Dies ist die Größe der Codeeinheit der obersten Ebene, in der das Problem gefunden wurde.

Bericht zu Objektreferenzen und Bericht über fehlende Objekte

object-references-report.md

missing-objects-report.md

Jede Zeile des Berichts zu Objektreferenzen enthält Informationen über die Codeeinheit der obersten Ebene, die ein anderes Element referenziert hat. Bei diesen referenzierten Elementen handelt es sich möglicherweise nicht um Elemente der obersten Ebene, sodass diese anderen Werte möglicherweise nicht in den Bericht über Codeeinheiten der obersten Ebene aufgenommen werden.

Ähnlich wie der Bericht zu Objektreferenzen enthält der Bericht über fehlende Objekte Informationen über die Codeeinheit der obersten Ebene, die ein Element referenziert hat, das im Code nicht gefunden werden konnte.

  • Caller Code Unit: Dies ist der Typ der Codeeinheit der obersten Ebene, die ein anderes Element referenziert.

  • Caller Code Unit Database: Dies ist die Datenbank der Codeeinheit der obersten Ebene, die ein anderes Element referenziert.

  • Caller Code Unit Schema: Dies ist das Schema der Codeeinheit der obersten Ebene, die ein anderes Element referenziert.

  • Caller Code Unit Name: Dies ist der Name der Codeeinheit der obersten Ebene, die ein anderes Element referenziert.

  • Caller Code Unit Full Name: Dies ist der vollständige Name der Codeeinheit der obersten Ebene, die ein anderes Element referenziert.

Informationen im Top-Level Code Units Report

Spalte

Beschreibung

Partition Key

Der eindeutige Bezeichner der Konvertierung.

Dateityp

Der Typ der Datei, in der sich die Codeeinheit befindet. (SQL, BTEQ usw.)

Kategorie

Die umfassendere Klasse oder der umfassendere Typ, zu dem jede Codeeinheit gehört.

Code Unit

Der Typ der Codeeinheit, zu der dieses Element gehört.

Source Database

Die Datenbank, in der sich die Quellcodeeinheit befindet.

Quellschema

Das Schema, in dem sich die Quellcodeeinheit befindet.

Name der Quelle

Der ursprüngliche Name der Quellcodeeinheit, wie er im Quellsystem angezeigt wird.

Code-Einheit-ID

Der eindeutige Bezeichner der Codeeinheit mit qualifiziertem Namen und Nummerierung für Codeeinheiten mit wiederholten Namen.

Dateiname

Der Name der Datei, in der sich das Objekt befindet. Verwendet den relativen Pfad ab dem Eingabeverzeichnis.

Line Number

Die Zeilennummer innerhalb der Datei, in der sich die Codeeinheit befindet.

Lines of Code

Die Gesamtzahl der Codezeilen, die die Codeeinheit umfasst.

EWI Count

Die Anzahl der EWIs, die in der Codeeinheit gefunden wurden. Mehr über EWIs erfahren Sie hier.

FDM Count

Die Anzahl der FDMs, die in der Codeeinheit gefunden wurden. Mehr über FDMs erfahren Sie hier.

PRF Count

Die Menge der innerhalb der Codeeinheit gefundenen PRFs. Hier erfahren Sie mehr über PRFs.

Highest EWI Severity

<p>Der höchste EWI-Schweregrad, der innerhalb der Codeeinheit gefunden wurde.<br>Die Reihenfolge der Schweregrade ist wie folgt:</p><ul><li>N/A (wenn es keine EWIsgibt)</li><li>Low</li><li>Medium</li><li>High</li><li>Critical</li></ul>

UDFs Used

Die Namen aller benutzerdefinierten Funktionen, die sich in der Codeeinheit befinden. Die Namen der verwendeten UDFs werden durch einen senkrechten Strich getrennt, wenn es mehr als einen gibt.

EWI

Der Code aller EWIs innerhalb der Codeeinheit. Dieser Code wird durch senkrechte Striche getrennt und enthält keinen sich wiederholenden Code.

FDM

Der Code aller FDMs innerhalb der Codeeinheit. Dieser Code wird durch senkrechte Striche getrennt und enthält keinen sich wiederholenden Code.

PRF

Der Code aller PRFs innerhalb der Codeeinheit. Dieser Code wird durch senkrechte Striche getrennt und enthält keinen sich wiederholenden Code.

Conversion Status

<p>Der endgültige Status der Konvertierung der Codeeinheit.</p><p>Die möglichen Konvertierungsstatus sind:</p><ul><li>NotSupported: Wenn die Codeeinheit eine Konvertierungsrate von 0 % hat.</li><li>Partial: Wenn die Konvertierungsrate der Codeeinheit zwischen 0 % und 100 % liegt.</li><li>Success: Wenn die Konvertierungsrate der Codeeinheit 100 % beträgt.</li></ul>

LoC Conversion Percentage

Der Prozentsatz der Konvertierungsrate basiert auf Codezeilen. Eine einzelne Codezeile kann unterstützte und nicht unterstützte Fragmente enthalten, je nachdem, wie der Eingabecode formatiert wurde. In diesen Fällen wird die gesamte Zeile als nicht unterstützt betrachtet.

Reihenfolge der Bereitstellung

Die Bereitstellungsreihenfolge ist die topologische Ebene jeder Codeeinheit auf der Grundlage ihrer Abhängigkeiten. Sie zeigt die richtige Reihenfolge an, in der die Codeeinheiten bereitgestellt werden sollten, um fehlende Abhängigkeiten während der Bereitstellungsphase zu vermeiden.

Sprache

Die Programmiersprache oder der SQL-Dialekt der Quellcodeeinheit.

Beispiel

Nehmen Sie an, dass sich die folgende CREATE TABLE-Anweisung in ORACLE SQL in einer Datei namens „table_example.sql“ befindet.

CREATE TABLE my_table (
  my_column DATE DEFAULT TO_DATE(CURRENT_DATE, 'J'),
  NOT A VALID COLUMN
);
Copy
CREATE OR REPLACE TABLE my_table (
   my_column TIMESTAMP /*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/ DEFAULT PUBLIC.JULIAN_TO_GREGORIAN_DATE_UDF(CURRENT_DATE(), 'J')
--                                                                                                                                                                          ,
-- ** SSC-EWI-0001 - UNRECOGNIZED TOKEN ON LINE '3' COLUMN '3' OF THE SOURCE CODE STARTING AT 'NOT'. EXPECTED 'Column Definition' GRAMMAR. LAST MATCHING TOKEN WAS ',' ON LINE '2' COLUMN '52'. FAILED TOKEN WAS 'NOT' ON LINE '3' COLUMN '3'. CODE '15'. **
--  NOT A VALID COLUMN
 )
 COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
 ;
Copy

Der Top-Level Code Units Report enthält einen einzigen Eintrag in der zuvor gezeigten Tabelle.

Hier sind alle Werte, die bei der Eingabe dieser CREATE TABLE-Anweisung gemeldet werden würden:

  • Der Wert von Partition Key hängt von der Migration ab, sodass der Wert hier variiert.

  • Der File Type ist SQL, da er für eine Datei mit der Erweiterung .sql migriert wurde.

  • Die Category ist TABLE, da die CREATE TABLE-Anweisung Teil der Codeeinheitenkategorie TABLE ist.

  • Die Code Unit selbst lautet CREATE TABLE.

  • Der File Name, der Datei, in der diese Codeeinheit gefunden wurde, lautet „table_example.sql“.

  • Unter der Annahme, dass die CREATE TABLE-Anweisung am Anfang der Datei steht, ist die Line Number 1.

  • Die Anzahl der Lines of Code ist 4.

  • In der Spalte EWI Count wird 1 angezeigt, da der Ausgabecode eine Parsing-EWI-Meldung aufweist.

  • Die Spalte FDM Count enthält 1, weil der Ausgabecode ein FDM- Problem bezüglich Datentypen aufweist.

  • Als PRF Count wird 0 angegeben, da keine PRF-Probleme im Ausgabecode vorhanden sind.

  • Die Highest EWI Severity wäre in diesem Fall „Critical“, da dies der Schweregrad der Parsing-EWI-Meldung im Beispiel ist. Die andere hat den Schweregrad „Low“.

  • Die Spalte UDFs Used enthält JULIAN_TO_GREGORIAN_DATE_UDF, da diese benutzerdefinierte Funktion hinzugefügt wurde, um die TO_DATE-Funktion des Eingabecodes zu konvertieren.

  • In der Spalte EWI wird „SSC-EWI-0001“ angezeigt, da dies eine der EWIs ist, die im Ausgabecode hinzugefügt wurden.

  • Die Spalte FDM enthält „SSC-FDM-OR0042“, da dies eine der FDMs war, die im Ausgabecode hinzugefügt wurden.

  • In der Spalte PRF wird „N/A“ angezeigt, da es im Ausgabecode keine PRF-Probleme gibt.

  • Der Conversion State lautet „Partial“ sein, da nur einige Fragmente dieser Codeeinheit ohne EWIs migriert werden konnten.

  • Die LoC Conversion Percentage beträgt 50 %, da von 4 Zeilen nur 2 erfolgreich konvertiert wurden.

Reihenfolge der Bereitstellung

Die Spalte für die Bereitstellungsreihenfolge gibt die korrekte Reihenfolge für die Bereitstellung der einzelnen Codeeinheiten in Snowflake an.

Der folgende Code veranschaulicht detailliert, wie die Bereitstellungsreihenfolge berechnet wird.

CREATE TABLE TABLE1 ( -- level 0, no dependencies
   COL1 INT
);

CREATE TABLE TABLE2 ( -- level 0, no dependencies
   COL1 INT
);

CREATE VIEW VIEW1 -- level 4, depends on level-3 objects
AS SELECT * FROM VIEW2, VIEW3;

CREATE VIEW VIEW2 -- level 3, depends on level-2 objects
AS SELECT * FROM VIEW4, VIEW5, VIEW3;

CREATE VIEW VIEW4 -- level 1, depends on level-0 objects
AS SELECT * FROM TABLE1, TABLE2;

CREATE VIEW VIEW5 -- level 1, depends on level-0 objects
AS SELECT * FROM TABLE1;

CREATE VIEW VIEW3 -- level 2, depends on level-1 objects
AS SELECT * FROM VIEW6;

CREATE VIEW VIEW6 -- level 1, depends on level-0 objects
AS SELECT * FROM TABLE2;
Copy

Die Bereitstellungsreihenfolge beginnt mit 0, sodass Codeeinheiten ohne Abhängigkeiten auf dieser Ebene beginnen. Im obigen Beispiel haben TABLE1 und TABLE2 die Ebene 0.

Bezüglich der nächsten Ebene konzentrieren wir uns auf Codeeinheiten, die von Codeeinheiten der Ebene 0 abhängen. VIEW4, VIEW5 und VIEW6 hängen direkt von TABLE1 und TABLE2 ab, sodass ihre Ebene 1 lautet.

Nachdem alle Codeeinheiten der Ebene 1 identifiziert wurden, konzentrieren wir uns auf die Codeeinheiten der Ebene 2. In diesem speziellen Szenario hängt nur VIEW3 von VIEW6 ab, sodass VIEW3 die Ebene 2 hat.

Nachdem wir alle Codeeinheiten der Ebene 2 identifiziert haben, konzentrieren wir uns auf Ebene 3. Im obigen Beispiel hängt VIEW2 von VIEW4, VIEW5 und VIEW3 ab, der höchste Abhängigkeitsgrad ist jedoch 2. Also hat VIEW2 die Ebene 3.

Schließlich haben wir noch VIEW1, die von VIEW2 und VIEW3 abhängt. Da VIEW2 die Abhängigkeit mit der höheren Ebene ist, erhält VIEW1 die Ebene 4.

Nachdem alle Berechnungen durchgeführt wurden, sieht der Bericht zu Codeeinheiten der obersten Ebene etwa wie die folgende Tabelle aus.

Code-Einheit-ID

Reihenfolge der Bereitstellung

VIEW1

4

VIEW2

3

VIEW3

2

VIEW4

1

VIEW5

1

VIEW6

1

TABLE1

0

TABLE2

0

Einschränkungen

Es gibt einige Szenarien, in denen die Bereitstellungsreihenfolge möglicherweise nicht die richtige Ebene für eine bestimmte Codeeinheit berechnet.

Codeeinheiten mit fehlenden Abhängigkeiten

Die Bereitstellung von Codeeinheiten, die (direkt oder indirekt) von fehlenden Objekten abhängen, ist nicht möglich. Obwohl SnowConvert AI die Reihenfolge der Bereitstellung so gut wie möglich berechnet, führt eine fehlende Abhängigkeit zu Bereitstellungsfehlern. Bei Codeeinheiten mit fehlenden Abhängigkeiten fügt SnowConvert AI ein Sternchen (*) neben der Bereitstellungsreihenfolge hinzu. Beispiel:

CREATE TABLE TABLE1 ( -- level 0, no dependencies
  COL1 INT
);

CREATE VIEW VIEW1 -- level 1*, depends on level-0 objects and has a missing dependency
AS SELECT * FROM TABLE1, TABLE2;

CREATE VIEW VIEW2 -- level 2*, depends on level-1* objects 
AS SELECT * FROM VIEW1;
Copy

Das obige Beispiel zeigt VIEW1, die auf eine fehlende TABLE2 verweist, und VIEW2, die auf VIEW1 verweist, die wiederum indirekt auf TABLE2 verweist. VIEW1 hat einen direkten fehlenden Verweis und VIEW2 einen indirekt fehlenden Verweist. Der Bericht zu Codeeinheiten der obersten Ebene sieht ungefähr wie in der folgenden Tabelle aus.

Code-Einheit-ID

Reihenfolge der Bereitstellung

TABLE1

0

VIEW1

1*

VIEW2

2*

Codeeinheiten, die auf DDLs verweisen, die in gespeicherten Prozeduren, anonymen Blöcken usw. definiert sind

In einigen Szenarien ist die Bereitstellungsreihenfolge möglicherweise nicht korrekt, da das referenzierte Element innerhalb einer anderen Codeeinheit definiert wurde. Beispiel:

CREATE TABLE TABLE1 (
  COL1 INT
);

CREATE OR REPLACE PROCEDURE PROC1 (param1 NUMBER)
IS
BEGIN
    CREATE VIEW VIEW1 
    AS
    SELECT * FROM TABLE1;
END;

CREATE VIEW VIEW2
AS SELECT * FROM VIEW1;
Copy

Im obigen Code verweist VIEW2 auf VIEW1, die nach der Ausführung der gespeicherten Prozedur erstellt wird. VIEW1 verweist auf TABLE1, sodass die Prozedur nach dem Erstellen der Tabelle ausgeführt werden sollte. In diesem speziellen Szenario wird VIEW1 nicht in den Bericht zu Codeeinheiten der obersten Ebene aufgenommen, da sie in der gespeicherten Prozedur enthalten ist. In diesem Fall ist es für VIEW2 unmöglich zu wissen, dass VIEW1 davon abhängt, dass PROC1 erstellt wird. Deshalb ist die Bereitstellungsreihenfolge möglicherweise nicht korrekt. Die folgende Tabelle zeigt die Bereitstellungsreihenfolge für den obigen Code.

Code-Einheit-ID

Reihenfolge der Bereitstellung

TABLE1

0

PROC1

1

VIEW2

1

Obwohl VIEW1 und PROC1 die gleiche Bereitstellungsreihenfolge haben, schlägt VIEW1 fehl, wenn die Prozedur nicht zuerst ausgeführt wurde.

Warnung

Die Unterstützung von Sequenzen bei der Bereitstellungsreihenfolge wird in einer zukünftigen Version ausgeliefert. Standardmäßig berücksichtigen Codeeinheiten, die auf Sequenzen verweisen, diese nicht bei der Berechnung der Bereitstellungsreihenfolge.