SnowConvert AI - トップレベルコードユニットレポート

トップレベルコードユニットとは

コードユニットとは、その名のとおり、最もアトミックで独立した実行要素です。ほとんどの場合、これらはステートメントですが、スクリプトファイルも1つの要素として実行されるため、スクリプトファイルも含まれます。

一部のコードユニットは、他のコードユニットの中にネストすることができます。ユニットの階層において、その上に他のコードユニットがない場合、それはトップレベルコードユニットと呼ばれます。

スコープ外のコードユニットとは

スコープ外のトップレベルコードユニットとは、 SnowConvert AI の変換スコープ外のコードユニットです。このため、変換率を計算する際には、これらのコードユニットは考慮されません。これらの各コードユニットには、変換率はありません( N/A と表示されます)。

入力コードにスコープ外のコードユニットのみが含まれている場合、移行全体のコード行数変換率は0%になります。

以下の CREATE TRIGGER は、スコープ外のコードユニットとみなされます。

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

トップレベルコードユニットの例

次のセクションでは、トップレベルコードユニットの例をいくつか紹介します。

クエリ

次の例では、 SELECT ステートメントを1つ使用しています。このステートメントは1つのトップレベルコードユニットです。

SELECT * FROM table1;
Copy

この例では、 SELECT ステートメントが別の SELECT ステートメントの中にネストされています。クエリ全体が1つのトップレベルコードユニットとしてカウントされます。

SELECT * FROM (SELECT * FROM table1);
Copy

オブジェクト

DDL で作成されたオブジェクトは、その中に他のコードユニットが含まれていても、1つのトップレベルコードユニットとしてカウントされます。

次のステートメントは、クエリを含むビューを作成します。この場合は、 CREATE VIEW 全体が1つのトップレベルコードユニットとしてカウントされます。

CREATE VIEW view1 AS SELECT * FROM table1;
Copy

次の CREATE PROCEDURE ステートメントは、その中に複数のステートメントが含まれていても、1つのトップレベルコードユニットとしてカウントされます。

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

コマンド

SQL ファイル内の独立したコマンドは、トップレベルコードユニットとみなされます。

COMMIT ステートメントは、1つのトップレベルコードユニットとしてカウントされます。

COMMIT;
Copy

Oracleのパッケージ本文

パッケージはその本文の中に複数の要素を定義することができます。パッケージ本文はトップレベルコードユニットとみなされます。なぜなら、パッケージ本文全体を作成しなければ、これらの要素を個別に作成できないからです。パッケージ本文内の要素やコードユニットは、トップレベルコードユニットとしてカウントされません。

以下のコードは、 CREATE PACKAGE BODY コードユニットとして報告されます。

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

Teradataスクリプトファイル

BTEQ や TPUMP のようなTeradataスクリプトファイルは、スタンドアロンのコードユニットとして実行されます。このため、ファイル全体が1つのトップレベルコードユニットとみなされます。これらのファイルの中にある他の可能性のあるコードユニットは、トップレベルコードユニットとしてカウントされません。

次の BTEQ スクリプトファイルは、単一の BTEQ トップレベルコードユニットとして報告されます。

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

GOTO のあるTransact SQL バッチ

Transact-SQL の各ステートメントは独立して実行できます。ほとんどの場合、これらのステートメントのそれぞれがトップレベルコードユニットとみなされます。しかし、同じバッチ内にラベルへの GOTO ステートメントを含むバッチがある場合、そのバッチのステートメントが正しく動作することを確認しないと、そのバッチを単独で実行することはできません。このため、 GOTO ステートメントを含むバッチ内のステートメントは、トップレベルコードユニットとしてカウントされず、バッチとしてのみカウントされます。

以下のコード例は、単一の GOTO/LABEL コードユニットとして報告されます。

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

他のレポートでコードユニットが扱われる手法

コードユニットの手法は、他のレポートでも紹介されています。このセクションでは、これらの値がどのように表示されるか、または他のレポートとどのように関連するかについて説明します。

問題に関するレポート

issues-report.md

問題レポートの各行には、問題の影響を受けているコードユニットに関する情報が記載されています。コードユニットに関連する列は以下のとおりです。

  • コードユニットデータベース: 問題が見つかったトップレベルのコードユニットのデータベースです。オブジェクトであるコードユニットにのみ適用されます。

  • コードユニットスキーマ: 問題が見つかったトップレベルコードユニットのスキーマです。オブジェクトであるコードユニットにのみ適用されます。

  • コードユニットパッケージ: 問題が見つかったトップレベルのコードユニットのパッケージです。オブジェクトであるコードユニットにのみ適用されます。

  • コードユニット名: 問題が見つかったトップレベルのコードユニット名です。オブジェクトのように名前のついたコードユニットにのみ適用されます。この名前はデータベース、スキーマ、パッケージによって修飾されません。

  • コードユニット ID: これは、問題が見つかったトップレベルのコードユニットの ID です。この名前は名前を修飾し、名前が繰り返されるコードユニットには番号を追加します。

  • コードユニット: 問題が見つかったトップレベルのコードユニットのタイプです。

  • コードユニットサイズ: 問題が見つかったトップレベルのコードユニットのサイズです。

オブジェクト参照レポートと欠落オブジェクトレポート

object-references-report.md

missing-objects-report.md

オブジェクト参照レポートの各行には、別の要素を参照していたトップレベルコードユニットに関する情報があります。これらの参照エレメントはトップレベルではないため、他の値はトップレベルコードユニットレポートに含まれない場合があります。

オブジェクト参照レポートと同様に、見つからないオブジェクトレポートには、コード内で見つからない要素を参照していたトップレベルコードユニットに関する情報があります。

  • 呼び出し元コードユニット: 他のエレメントを参照するトップレベルコードユニットのタイプです。

  • 呼び出し元コードユニットデータベース: 他のエレメントを参照しているトップレベルコードユニットのデータベースです。

  • 呼び出し元コードユニットスキーマ: 他の要素を参照するトップレベルコードユニットのスキーマです。

  • 呼び出し元コードユニット名: 別の要素を参照するトップレベルコードユニットの名前です。

  • 呼び出し元コードユニット完全名): 別の要素を参照するトップレベルコードユニットの完全名です。

トップレベルコードユニットレポートの情報

説明

パーティションキー

変換の一意識別子。

ファイルタイプ

コードユニットがあるファイルのタイプ。(SQL、 BTEQ など)

カテゴリ

各コードユニットが属する、広範なクラスまたはタイプ。

コードユニット

この要素が属するコードユニットのタイプ。

ソースデータベース

ソースコードユニットが置かれているデータベース。

ソーススキーマ

ソースコードユニットが置かれているスキーマ。

ソース名

ソースシステムで表示されるソースコードユニットの元の名前。

コードユニットID

修飾名と、繰り返し名を持つコードユニットのための番号を含む、コードユニットの固有識別子。

ファイル名

オブジェクトが置かれているファイル名。入力ディレクトリからの相対パスを使用します。

行番号

コードユニットがあるファイル内の行番号。

コード行数

コードユニットが持つコードの合計行数。

EWI カウント

コードユニット内で見つかった EWIs の数。EWIs については、 こちら をご参照ください。

FDM カウント

コードユニット内で見つかった FDMs の数。FDMs については、 こちら をご参照ください。

PRF カウント

コードユニット内で見つかった PRFs の数。詳細については PRFs こちら をご参照ください。

最大 EWI 重大度

<p>コードユニット内で見つかった最大の EWI 重大度。<br>重大度の順序は以下のとおりです。</p><ul><li>N/A(EWIs がない場合)</li><li>Low</li><li>Medium</li> <li>High</li><li>Critical</li></ul>

使用された UDFs

コードユニット内のすべてのユーザー定義関数の名前。使用された UDFs の名前は、複数ある場合はパイプで区切られます。

EWI

コードユニット内にあるすべての EWIs のコード。これらのコードはパイプで区切られており、繰り返しコードは含まれていません。

FDM

コードユニット内にあるすべての FDMs のコード。これらのコードはパイプで区切られており、繰り返しコードは含まれていません。

PRF

コードユニット内にあるすべての PRFs のコード。これらのコードはパイプで区切られており、繰り返しコードは含まれていません。

変換ステータス

<p>コードユニットの変換の最終ステータスです。</p><p>可能な変換ステータスは次のとおりです。</p><ul><li>NotSupported: コードユニットの変換率が0%のとき。</li><li>Partial: コードユニットの変換率が0%から100%の間のとき。</li><li>Success: コードユニットの変換率が100%のとき。</li></ul>

LoC 変換パーセント

変換率はコード行数に基づいています。1行のコードには、入力コードの形式によって、サポートされるフラグメントとサポートされないフラグメントがあります。このような場合、その行全体がサポートされていないと見なされます。

デプロイ順序

デプロイ順序は、依存関係に基づく各コードユニットのトポロジーレベルです。これは、デプロイ段階で依存関係が欠落しないように、コードユニットをデプロイする正しい順序を示します。

言語

ソースコードユニットのプログラミング言語または SQL 方言。

ORACLE SQL 内の次の CREATE TABLE が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

トップレベルコードユニットレポートには、先に示したテーブルが1つだけ表示されます。

以下は、この CREATE TABLE ステートメントのエントリで報告されるすべての値です。

  • パーティションキー の値は移行によって異なります。

  • ファイルタイプ は、.sql拡張子を持つファイルで移行されたため、 SQL となります。

  • CREATE TABLE ステートメントは TABLE コードユニットカテゴリの一部であるため、 カテゴリ は TABLE になります。

  • コードユニット 自体は CREATE TABLE になります。

  • このコードユニットが見つかった ファイル名 はtable_example.sqlです。

  • CREATE TABLE ステートメントがファイルの先頭にあると仮定すると、 行番号 は1になります。

  • コード行 の数字は4になります。

  • EWI カウント 列は、出力コードに1つの解析 EWI があるため、1と表示されます。

  • FDM カウント 列に1と表示されるのは、出力コードにデータ型に関連する FDM 問題があるためです。

  • 出力コードに PRF の問題が存在しないため、 PRF カウント は0を報告します。

  • この場合の 最大 EWI 重大度 は、例の解析 EWI の重大度であるため、「Critica」になります。もう1つの重大度は「Low」です。

  • このカスタムユーザー定義関数は、入力コードの TO_DATE 関数を変換するために追加されたため、 使用された UDFs 列は JULIAN_TO_GREGORIAN_DATE_UDF になります。

  • EWI 列は「SSC-EWI-0001」と表示されます。これは出力コードで追加された EWIs のうちの1つだからです。

  • FDM 列は「SSC-FDM-OR0042」と表示されます。これは出力コードで追加された FDMs のうちの一つだからです。

  • 出力コードには PRF の問題が存在しないため、 PRF 列は「N/A」と表示されます。

  • 変換ステータス は「Partial」になります。これは、このコードユニットの一部のフラグメントのみが、 EWIs なしで移行できたためです。

  • LoC 変換パーセント は50%です。4行中、変換に成功したのは2行のみだからです。

デプロイ順序

デプロイ順序の列は、各コードユニットをSnowflakeにデプロイする正しい順序を表しています。

次のコードは、デプロイ順序がどのように計算されるかを詳しく例示しています。

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

デプロイ順序は 0 から始まるので、依存関係のないコードユニットはこのレベルから始まります。上記の例では、 TABLE1TABLE2 はレベル 0 を持ちます。

次のレベルでは、レベル 0 のコードユニットに依存するコードユニットに注目します。 VIEW4VIEW5 、および VIEW6TABLE1TABLE2 に直接依存するので、それらのレベルは 1 になります。

レベル 1 のすべてのコードユニットを特定した後、レベル 2 のコードユニットに注目します。 その特定のシナリオでは、 VIEW3VIEW6 に依存しているだけなので、 VIEW3 はレベル 2 になります。

レベル 2 のすべてのコードユニットを特定したら、レベル3に注目します。上記の例では、 VIEW2VIEW4VIEW5VIEW3 に依存しますが、最も高い依存レベルは 2 であるため、 VIEW2 はレベル 3 になります。

最後に、 VIEW2VIEW3 に依存する VIEW1 があります。VIEW2 はより高いレベルを持つ依存関係なので、 VIEW1 はレベル 4 になります。

すべての計算が終わると、トップレベルコードユニットレポートは次の表のようになります。

コードユニットID

デプロイ順序

VIEW1

4

VIEW2

3

VIEW3

2

VIEW4

1

VIEW5

1

VIEW6

1

TABLE1

0

TABLE2

0

制限事項

デプロイ順序が特定のコードユニットの適切なレベルを計算しないシナリオもあります。

依存関係が欠落しているコードユニット

欠落しているオブジェクトに(直接的または間接的に)依存するコードユニットはデプロイできません。SnowConvert AI は可能な限りデプロイ順序を計算しますが、依存関係が欠落しているとデプロイエラーが発生します。依存関係が欠落しているコードユニットについては、 SnowConvert AI がデプロイ順序の横にアスタリスク( * )を追加します。例:

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

上記の例では、 VIEW1 が欠落している TABLE2 を参照し、VIEW2VIEW1 を参照していて TABLE2 を間接的に参照しています。 VIEW1 は直接的に欠落している参照があり、 VIEW2 は間接的に欠落している参照があります。トップレベルコードユニットレポートは以下の表のようになります。

コードユニットID

デプロイ順序

TABLE1

0

VIEW1

1*

VIEW2

2*

ストアドプロシージャや匿名ブロックなどの内部で定義された DDLs を参照するコードユニット

シナリオによっては、参照される要素が別のコードユニットの内部で定義されているため、デプロイ順序が正しくないことがあります。例:

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

上記のコードでは、 VIEW2 はストアドプロシージャを実行した後に作成される VIEW1 を参照しています。 VIEW1TABLE1 を参照しているので、プロシージャはテーブルを作成した後に実行する必要があります。その特定のシナリオでは、 VIEW1 はストアドプロシージャに含まれているため、トップレベルコードユニットレポートには含まれません。その場合、 VIEW2VIEW1 が作成される PROC1 に依存していることを知ることができず、そのためにデプロイ順序が正しくないことがあります。次の表は、上記のコードのデプロイ順序を示しています。

コードユニットID

デプロイ順序

TABLE1

0

PROC1

1

VIEW2

1

VIEW1PROC1 のデプロイ順序は同じであるにもかかわらず、 VIEW1 は、プロシージャが最初に実行されなかった場合、失敗します。

警告

シーケエンスのデプロイ順序は、今後のバージョンでサポートされる予定です。デフォルトでは、シーケンスを参照するコードユニットは、デプロイ順序を計算するためにそれらを考慮しません。