SnowConvert AI - Top-Level Code Units Report¶
トップレベルコードユニットとは¶
コードユニットとは、その名のとおり、最もアトミックで独立した実行要素です。ほとんどの場合、これらはステートメントですが、スクリプトファイルも1つの要素として実行されるため、スクリプトファイルも含まれます。
一部のコードユニットは、他のコードユニットの中にネストすることができます。ユニットの階層において、その上に他のコードユニットがない場合、それはトップレベルコードユニットと呼ばれます。
スコープ外のコードユニットとは¶
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
).
入力コードにスコープ外のコードユニットのみが含まれている場合、移行全体のコード行数変換率は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 カウント |
The amount of PRFs found within the code unit. You can learn more about PRFs here. |
最大 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行のコードには、入力コードの形式によって、サポートされるフラグメントとサポートされないフラグメントがあります。このような場合、その行全体がサポートされていないと見なされます。 |
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. |
例¶
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行のみだからです。
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;
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;
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 Database Links (Oracle)¶
While SnowConvert AI can identify references to Database Links, it cannot get more information about the objects being referenced through the database link. This kind of reference may cause trouble during deployment as well, so it will be handled the same way as missing object references. E.g.
CREATE DATABASE LINK DBLINK1
CONNECT TO PUBLIC IDENTIFIED BY VALUES ':1'
USING 'TEST';
CREATE MATERIALIZED VIEW VIEW1 REFRESH WITH ROWID
AS SELECT * FROM TABLE1@DBLINK1;
VIEW1
is referencing TABLE1
through the database link DBLINK1
. Since we don't know where TABLE1
is located, the deployment order of VIEW1
will be handled like a deployment order with missing dependencies (*).
Code Unit Id |
Deployment Order |
---|---|
DBLINK1 |
0 |
VIEW1 |
1* |
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;
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.
警告
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.