SnowConvert AI - Top-Level Code Units Report

Qu’est-ce qu’une unité de code de niveau supérieur ?

Une unité de code, comme son nom l’indique, est l’élément exécutable le plus atomique et le plus autonome. Dans la plupart des cas, il s’agit d’instructions, mais aussi de fichiers de scripts, car ceux-ci sont exécutés en tant qu’élément unique.

Certaines unités de code peuvent être imbriquées dans d’autres unités de code. Lorsqu’il n’y a pas d’autre unité de code au-dessus dans une hiérarchie d’unités, on parle d’unité de code de niveau supérieur.

Qu’est-ce qu’une unité de code hors champ d’application ?

Out-of-scope Top-Level Code Units are Code Units that are out of the conversion scope of SnowConvert AI. Because of this, these code units are not considered when calculating the conversion rate. Each of these code units will not have a conversion rate (it will appear as N/A).

Si le code d’entrée ne comprend que des unités de code hors champ d’application, le taux de conversion des lignes de code de l’ensemble de la migration sera de 0 %.

La commande CREATE TRIGGER suivante est considérée comme une unité de code hors champ d’application.

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

Exemples d’unités de code de niveau supérieur

Dans la section suivante, nous pouvons voir quelques exemples d’unités de code de niveau supérieur.

Requêtes

Dans l’exemple suivant, il s’agit d’une instruction SELECT unique. Cette instruction est une unité de code unique de niveau supérieur.

SELECT * FROM table1;
Copy

Dans cet exemple, nous avons une instruction SELECT imbriquée dans une autre instruction SELECT. La requête entière compte pour une unité de code unique de niveau supérieur.

SELECT * FROM (SELECT * FROM table1);
Copy

Objets

Les objets créés à l’aide d’un DDL comptent pour une unité de code unique de niveau supérieur, même s’ils contiennent d’autres unités de code.

L’instruction suivante crée une vue avec une requête. Dans ce cas, CREATE VIEW compte pour une unité de code unique de niveau supérieur.

CREATE VIEW view1 AS SELECT * FROM table1;
Copy

L’instruction CREATE PROCEDURE compte pour une unité de code unique de niveau supérieur, même si elle contient plusieurs instructions.

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

Commandes

Les commandes indépendantes d’un fichier SQL sont considérées comme des unités de code de niveau supérieur.

Une instruction COMMIT compte pour une unité de code unique de niveau supérieur.

COMMIT;
Copy

Corps des paquets dans Oracle

Un paquet peut définir plusieurs éléments à l’intérieur de son corps. Le corps du paquet est considéré comme l’unité de code de niveau supérieur car ces éléments ne peuvent être créés individuellement sans créer le corps entier du paquet. Les éléments ou unités de code à l’intérieur du corps d’un paquet ne sont pas comptabilisés comme unités de code de niveau supérieur.

Le code suivant sera signalé comme une unité de code CREATE PACKAGE BODY unique.

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

Fichiers de script Teradata

Les fichiers de script Teradata tels que BTEQ ou TPUMP sont exécutés en tant qu’unités de code autonomes. De ce fait, le fichier entier est considéré comme une unité de code unique de niveau supérieur. Les autres unités de code possibles à l’intérieur de ces fichiers ne sont pas comptabilisées comme unités de code de niveau supérieur.

Le fichier de script BTEQ suivant sera signalé comme une unité de code unique BTEQ de niveau supérieur.

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

Lots Transact SQL avec GOTO

Chaque instruction de lot Transact SQL peut être exécutée indépendamment. Dans la plupart des cas, chacune de ces instructions est considérée comme une unité de code de niveau supérieur. Toutefois, lorsqu’un lot contient une instruction GOTO sur une étiquette à l’intérieur du même lot, les instructions du lot ne peuvent pas être exécutées indépendamment sans que l’on s’assure qu’elles fonctionnent correctement. Pour cette raison, les instructions qui font partie d’un lot avec une instruction GOTO ne compteront pas pour unités de code de niveau supérieur, mais seulement le lot.

L’exemple de code suivant sera signalé comme une unité de code GOTO/LABEL unique :

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

Comment la méthodologie d’unité de code est-elle représentée dans d’autres rapports ?

La méthodologie d’unité de code est également représentée dans d’autres rapports. Cette section explique comment ces valeurs sont affichées ou sont liées à d’autres rapports.

Rapport sur les problèmes

issues-report.md

Chaque ligne du rapport sur les problèmes contient des informations sur l’unité de code concernée par le problème. Les colonnes relatives aux unités de code sont les suivantes :

  • Base de données de l’unité de code : Il s’agit de la base de données de l’unité de code de niveau supérieur où le problème a été détecté. Elle ne s’applique qu’aux unités de code qui sont des objets.

  • Schéma de l’unité de code : Il s’agit du schéma de l’unité de code de niveau supérieur où le problème a été détecté. Elle ne s’applique qu’aux unités de code qui sont des objets.

  • Paquet de l’unité de code : Il s’agit du paquet de l’unité de code de niveau supérieur où le problème a été détecté. Elle ne s’applique qu’aux unités de code qui sont des objets.

  • Nom de l’unité de code : Il s’agit du nom de l’unité de code de niveau supérieur où le problème a été détecté. Il ne s’applique qu’aux unités de code nommées, comme les objets. Ce nom n’est pas qualifié par une base de données, un schéma ou un paquet.

  • ID de l’unité de code : Il s’agit de l’ID de l’unité de code de niveau supérieur où le problème a été détecté. Ce nom est qualifié et un numéro est ajouté pour les unités de code dont le nom est répété.

  • Unité de code : Il s’agit du type de l’unité de code de niveau supérieur où le problème a été détecté.

  • Taille de l’unité de code : Il s’agit de la taille de l’unité de code de niveau supérieur où le problème a été détecté.

Rapport sur les références d’objet et rapport sur les objets manquants

object-references-report.md

missing-objects-report.md

Chaque ligne du rapport sur les références d’objets contient des informations sur l’unité de code de niveau supérieur qui faisait référence à un autre élément. Ces éléments référencés peuvent ne pas être de niveau supérieur, de sorte que ces autres valeurs peuvent ne pas être incluses dans le rapport sur les unités de code de niveau supérieur.

De même que le rapport sur les références d’objets, le rapport sur les objets manquants contient des informations sur l’unité de code de niveau supérieur qui faisait référence à un élément introuvable dans le code.

  • Unité de code de l’appelant : Il s’agit du type de l’unité de code de niveau supérieur qui fait référence à un autre élément.

  • Base de données de l’unité de code de l’appelant : Il s’agit de la base de données de l’unité de code de niveau supérieur qui fait référence à un autre élément.

  • Schéma de l’unité de code de l’appelant : Il s’agit du schéma de l’unité de code de niveau supérieur qui fait référence à un autre élément.

  • Nom de l’unité de code de l’appelant : Il s’agit du nom de l’unité de code de niveau supérieur qui fait référence à un autre élément.

  • Nom complet de l’unité de code de l’appelant : Il s’agit du nom complet de l’unité de code de niveau supérieur qui fait référence à un autre élément.

Informations contenues dans le rapport sur les unités de code de niveau supérieur

Colonne

Description

Clé de partition

L’identificateur unique de la conversion.

Type de fichier

Le type du fichier dans lequel se trouve l’unité de code. (SQL, BTEQ, etc…)

Catégorie

La classe ou le type plus large auquel appartient chaque unité de code.

Unité de code

Le type d’unité de code auquel cet élément appartient.

Nom de l’unité de code

Le nom de l’unité de code, le cas échéant, comme les tables ou les procédures. Ce sera N/A pour les éléments sans nom comme DMLs.

File Name

Le nom du fichier dans lequel se trouve l’objet. Utilise le chemin relatif à partir du répertoire d’entrée.

Numéro de ligne

Le numéro de ligne dans le fichier où se trouve l’unité de code.

Lignes de code

Le nombre total de lignes de code de l’unité de code.

Nombre d’EWI

Le nombre d’EWIs trouvés dans l’unité de code. Vous pouvez en savoir plus sur les EWIs ici.

Nombre de FDM

Le nombre de FDMs trouvés dans l’unité de code. Vous pouvez en savoir plus sur les FDMs ici.

Nombre de PRF

The amount of PRFs found within the code unit. You can learn more about PRFs here.

Valeur de gravité EWI la plus élevée

<p>La valeur de gravité EWI la plus élevée trouvée dans l’unité de code.<br>L’ordre de gravité est le suivant :</p><ul><li>N/A (lorsqu’il n’y a pas d’EWIs)</li><li>Faible</li><li>Moyen</li><li>Élevé</li><li>Critique</li></ul>

UDFs utilisés

Les noms de toutes les fonctions définies par l’utilisateur qui se trouvent dans l’unité de code. Les noms des UDFs utilisés sont séparés par un canal s’il y en a plusieurs.

EWI

Les codes de tous les EWIs qui se trouvent dans l’unité de code. Ces codes sont séparés par des canaux et ne comprennent pas les codes répétés.

FDM

Les codes de tous les FDMs qui se trouvent dans l’unité de code. Ces codes sont séparés par des canaux et ne comprennent pas les codes répétés.

PRF

Les codes de tous les PRFs qui se trouvent dans l’unité de code. Ces codes sont séparés par des canaux et ne comprennent pas les codes répétés.

Statut de conversion

<p>Le statut final de la conversion de l’unité de code.</p><p>Les statuts de conversion possibles sont :</p><ul><li>NotSupported : Lorsque le taux de conversion de l’unité de code est de 0 %.</li><li>Partiel : Lorsque le taux de conversion de l’unité de code est compris entre 0 et 100 %.</li><li>Réussite : Lorsque le taux de conversion de l’unité de code est de 100 %.</li></ul>

Pourcentage de conversion LoC

Le pourcentage de conversion est basé sur les lignes de code. Une ligne de code unique peut comporter des fragments pris en charge et des fragments non pris en charge, en fonction du formatage du code d’entrée. Dans ces cas, la ligne entière est considérée comme non prise en charge.

Deployment Order

The deployment order is the topological level of each code unit based on its dependencies. It shows the right order in which the code units should be deployed to avoid missing dependencies during the deployment phase.

Exemple

Supposons que l’instruction CREATE TABLE suivante ORACLE SQL se trouve dans son fichier appelé table_example.sql.

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

Le rapport sur les unités de code de niveau supérieur ne comportera qu’une seule entrée de la table présentée précédemment.

Voici toutes les valeurs qui seront signalées dans l’entrée de cette instruction CREATE TABLE :

  • La valeur de la clé de partition dépendra de la migration, la valeur ici variera donc.

  • Le type de fichier sera SQL car il a été migré sur un fichier portant l’extension .sql.

  • La catégorie sera TABLE car l’instruction CREATE TABLE fait partie de la catégorie d’unité de code TABLE.

  • L”unité de code elle-même sera CREATE TABLE.

  • Le nom du fichier dans lequel cette unité de code a été trouvée est table_example.sql.

  • En supposant que l’instruction CREATE TABLE se trouve au début du fichier, le numéro de ligne sera 1.

  • Le nombre de lignes de code est 4.

  • La colonne Nombre d’EWI indique 1 car le code de sortie a un EWI en cours d’analyse.

  • La colonne Nombre de FDM indique 1 car le code de sortie présente un problème FDM lié aux types de données.

  • La colonne Nombre de PRF indique 0 car il n’y a pas de problème PRF dans le code de sortie.

  • Dans ce cas, la valeur de gravité de l’EWI la plus élevée est « Critique » car il s’agit de la valeur de gravité de l’EWI en cours d’analyse de l’exemple. Dans l’autre exemple, la valeur de gravité est « faible ».

  • La colonne UDFs utilisés est JULIAN_TO_GREGORIAN_DATE_UDF car cette fonction définie par l’utilisateur a été ajoutée pour convertir la fonction TO_DATE du code d’entrée.

  • La colonne EWI indiquera « SSC-EWI-0001 «  car il s’agit d’un des EWIs ajoutés dans le code de sortie.

  • La colonne FDM indiquera « SSC-FDM-OR0042 » car il s’agit d’un des FDMs ajoutés dans le code de sortie.

  • La colonne PRF indiquera « N/A » car il n’y a pas de problème PRF dans le code de sortie.

  • Le statut de conversion sera « Partiel » car seuls certains fragments de cette unité de code ont pu être migrés sans EWIs.

  • Le pourcentage de conversion LoC est de 50 % car sur 4 lignes, seules 2 ont été converties avec succès.

Deployment Order

The deployment order column represents the correct order to deploy each code unit into Snowflake.

The following code exemplifies in depth how the deployment order is calculated.

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

The deployment order starts with 0, so code units without any dependencies will start at this level. In the example above, TABLE1 and TABLE2 will have a level 0 .

For the next level, we will focus on code units that depend on code units of level 0. VIEW4, VIEW5, and VIEW6 depend directly on TABLE1 and TABLE2, so their level will be 1.

After identifying all the code units of level 1 , we will focus on code units of level 2. In that particular scenario, just VIEW3 depends on VIEW6 , so VIEW3 will be level 2.

Once we identify all code units of level 2, we will focus on level 3. In the example above, VIEW2 depends on VIEW4, VIEW5 and VIEW3, however, the highest dependency level is 2, so, VIEW2 will be of level 3.

Finally, we got VIEW1, which depends on VIEW2 and VIEW3. Since VIEW2 is the dependency with higher level, VIEW1 will get level 4.

After making all the calculations, the top-level code units report will look something like the following table.

Code Unit Id

Deployment Order

VIEW1

4

VIEW2

3

VIEW3

2

VIEW4

1

VIEW5

1

VIEW6

1

TABLE1

0

TABLE2

0

Limitations

There are some scenarios where the deployment order may not calculate the right level for a specific code unit.

Code Units with Missing Dependencies

Deployment of code units that depend (directly or indirectly) on missing objects is not possible. Although SnowConvert AI calculates the deployment order as best it can, a missing dependency will cause deployment errors. For code units with missing dependencies, SnowConvert AI adds an asterisk (*) alongside the deployment order. E.g.

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

The example above shows VIEW1 referencing a missing TABLE2 and VIEW2 referencing ,VIEW1 which indirectly refers TABLE2 . VIEW1 has a direct missing reference and VIEW2 an indirect missing reference. The top-level code units report will look something like the following table.

Code Unit Id

Deployment Order

TABLE1

0

VIEW1

1*

VIEW2

2*

Code Units referencing DDLs defined inside Stored Procedures, Anonymous Blocks, etc

In some scenarios, the deployment order may not be correct because the referenced element was defined inside another code unit. E.g.

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

In the code above, VIEW2 references VIEW1, which will be created after executing the stored procedure. VIEW1 references TABLE1, so the procedure should be executed after creating the table. In that particular scenario, VIEW1 will not be included in the top-level code units report since it is contained by the stored procedure. In that case, for VIEW2 is not possible to know that VIEW1 depends on PROC1 to be created, and the deployment order may not be correct because of that. The following table shows the deployment order for the code above.

Code Unit Id

Deployment Order

TABLE1

0

PROC1

1

VIEW2

1

Despite VIEW1 and PROC1 having the same deployment order, VIEW1 will fail if the procedure was not executed first.

Avertissement

Deployment Order support for Sequences is going to be delivered in a future version. By default, Code Units referencing sequences are not considering them to calculate the deployment order.