SnowConvert : Rapport sur les unités de code de niveau supérieur

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 ?

Les unités de code de premier niveau hors champ d’application sont des unités de code qui n’entrent pas dans le champ d’application de la conversion de SnowConvert. Pour cette raison, ces unités de code ne sont pas prises en compte dans le calcul du taux de conversion. Chacune de ces unités de code n’aura pas de taux de conversion (elle apparaîtra comme 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

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

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.

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.