SnowConvert: トップレベルコードユニットレポート¶
トップレベルコードユニットとは¶
コードユニットとは、その名のとおり、最もアトミックで独立した実行要素です。ほとんどの場合、これらはステートメントですが、スクリプトファイルも1つの要素として実行されるため、スクリプトファイルも含まれます。
一部のコードユニットは、他のコードユニットの中にネストすることができます。ユニットの階層において、その上に他のコードユニットがない場合、それはトップレベルコードユニットと呼ばれます。
スコープ外のコードユニットとは¶
スコープ外のトップレベルコードユニットとは、 SnowConvert の変換スコープ外のコードユニットです。このため、変換率を計算する際には、これらのコードユニットは考慮されません。これらのコードユニットには、それぞれの変換率はありません(N/A
と表示されます)。
入力コードにスコープ外のコードユニットのみが含まれている場合、移行全体のコード行数変換率は0%になります。
以下の CREATE TRIGGER
は、スコープ外のコードユニットとみなされます。
CREATE OR REPLACE TRIGGER my_trigger
AFTER
UPDATE
ON my_table
FOR EACH ROW
BEGIN
NULL;
END;
トップレベルコードユニットの例¶
次のセクションでは、トップレベルコードユニットの例をいくつか紹介します。
クエリ¶
次の例では、 SELECT ステートメントを1つ使用しています。このステートメントは1つのトップレベルコードユニットです。
SELECT * FROM table1;
この例では、 SELECT
ステートメントが別の SELECT
ステートメントの中にネストされています。クエリ全体が1つのトップレベルコードユニットとしてカウントされます。
SELECT * FROM (SELECT * FROM table1);
オブジェクト¶
DDL で作成されたオブジェクトは、その中に他のコードユニットが含まれていても、1つのトップレベルコードユニットとしてカウントされます。
次のステートメントは、クエリを含むビューを作成します。この場合は、 CREATE VIEW
全体が1つのトップレベルコードユニットとしてカウントされます。
CREATE VIEW view1 AS SELECT * FROM table1;
次の CREATE PROCEDURE
ステートメントは、その中に複数のステートメントが含まれていても、1つのトップレベルコードユニットとしてカウントされます。
CREATE PROCEDURE procedure1
AS
BEGIN
DELETE FROM table1;
END;
コマンド¶
SQL ファイル内の独立したコマンドは、トップレベルコードユニットとみなされます。
COMMIT
ステートメントは、1つのトップレベルコードユニットとしてカウントされます。
COMMIT;
Oracleのパッケージ本文¶
パッケージはその本文の中に複数の要素を定義することができます。パッケージ本文はトップレベルコードユニットとみなされます。なぜなら、パッケージ本文全体を作成しなければ、これらの要素を個別に作成できないからです。パッケージ本文内の要素やコードユニットは、トップレベルコードユニットとしてカウントされません。
以下のコードは、 CREATE PACKAGE BODY
コードユニットとして報告されます。
CREATE PACKAGE package_body1 IS
FUNCTION function1
RETURN VARCHAR
IS
BEGIN
RETURN 'HELLO'';
END;
END;
Teradataスクリプトファイル¶
BTEQ や TPUMP のようなTeradataスクリプトファイルは、スタンドアロンのコードユニットとして実行されます。このため、ファイル全体が1つのトップレベルコードユニットとみなされます。これらのファイルの中にある他の可能性のあるコードユニットは、トップレベルコードユニットとしてカウントされません。
次の BTEQ スクリプトファイルは、単一の BTEQ トップレベルコードユニットとして報告されます。
.LOGON e/fml,notebook
.COMPILE FILE = example.spl;
COMMIT;
CALL samplesp1 (8888, pAmount);
.LOGOFF
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
他のレポートでコードユニットが扱われる手法¶
コードユニットの手法は、他のレポートでも紹介されています。このセクションでは、これらの値がどのように表示されるか、または他のレポートとどのように関連するかについて説明します。
問題に関するレポート¶
問題レポートの各行には、問題の影響を受けているコードユニットに関する情報が記載されています。コードユニットに関連する列は以下のとおりです。
コードユニットデータベース: 問題が見つかったトップレベルのコードユニットのデータベースです。オブジェクトであるコードユニットにのみ適用されます。
コードユニットスキーマ: 問題が見つかったトップレベルコードユニットのスキーマです。オブジェクトであるコードユニットにのみ適用されます。
コードユニットパッケージ: 問題が見つかったトップレベルのコードユニットのパッケージです。オブジェクトであるコードユニットにのみ適用されます。
コードユニット名: 問題が見つかったトップレベルのコードユニット名です。オブジェクトのように名前のついたコードユニットにのみ適用されます。この名前はデータベース、スキーマ、パッケージによって修飾されません。
コードユニット ID: これは、問題が見つかったトップレベルのコードユニットの ID です。この名前は名前を修飾し、名前が繰り返されるコードユニットには番号を追加します。
コードユニット: 問題が見つかったトップレベルのコードユニットのタイプです。
コードユニットサイズ: 問題が見つかったトップレベルのコードユニットのサイズです。
オブジェクト参照レポートと欠落オブジェクトレポート¶
オブジェクト参照レポートの各行には、別の要素を参照していたトップレベルコードユニットに関する情報があります。これらの参照エレメントはトップレベルではないため、他の値はトップレベルコードユニットレポートに含まれない場合があります。
オブジェクト参照レポートと同様に、見つからないオブジェクトレポートには、コード内で見つからない要素を参照していたトップレベルコードユニットに関する情報があります。
呼び出し元コードユニット: 他のエレメントを参照するトップレベルコードユニットのタイプです。
呼び出し元コードユニットデータベース: 他のエレメントを参照しているトップレベルコードユニットのデータベースです。
呼び出し元コードユニットスキーマ: 他の要素を参照するトップレベルコードユニットのスキーマです。
呼び出し元コードユニット名: 別の要素を参照するトップレベルコードユニットの名前です。
呼び出し元コードユニット完全名): 別の要素を参照するトップレベルコードユニットの完全名です。
トップレベルコードユニットレポートの情報¶
列 |
説明 |
---|---|
パーティションキー |
変換の一意識別子。 |
ファイルタイプ |
コードユニットがあるファイルのタイプ。(SQL、 BTEQ など) |
カテゴリ |
各コードユニットが属する、広範なクラスまたはタイプ。 |
コードユニット |
この要素が属するコードユニットのタイプ。 |
コードユニット名 |
テーブルやプロシージャなどのコードユニットがある場合は、コードユニットの名前。DMLs のような名前のない要素は該当しません。 |
ファイル名 |
オブジェクトが置かれているファイル名。入力ディレクトリからの相対パスを使用します。 |
行番号 |
コードユニットがあるファイル内の行番号。 |
コード行数 |
コードユニットが持つコードの合計行数。 |
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行のコードには、入力コードの形式によって、サポートされるフラグメントとサポートされないフラグメントがあります。このような場合、その行全体がサポートされていないと見なされます。 |
例¶
ORACLE SQL 内の次の CREATE TABLE
がtable_example.sqlというファイルにあるとします。
CREATE TABLE my_table (
my_column DATE DEFAULT TO_DATE(CURRENT_DATE, 'J'),
NOT A VALID COLUMN
);
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"}}'
;
トップレベルコードユニットレポートには、先に示したテーブルが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行のみだからです。