SnowConvert: Relatório de unidades de código de nível superior¶
O que é uma unidade de código de nível superior?¶
Uma unidade de código, como o nome sugere, é o elemento executável mais atômico e autônomo. Na maioria dos casos, são instruções, mas também incluem arquivos de script, pois são executados como um único elemento.
Algumas unidades de código podem ser aninhadas dentro de outras unidades de código. Quando não há outra unidade de código acima dela em uma hierarquia de unidades, ela é chamada de unidade de código de nível superior.
O que é uma unidade de código fora do escopo?¶
Unidades de código de nível superior fora do escopo são unidades de código que estão fora do escopo de conversão do SnowConvert. Por esse motivo, essas unidades de código não são consideradas no cálculo da taxa de conversão. Cada uma dessas unidades de código não terá uma taxa de conversão (aparecerá como N/A
).
Se o código de entrada incluir apenas unidades de código fora do escopo, a taxa de conversão de linhas de código de toda a migração será de 0%.
A seguinte CREATE TRIGGER
é considerada uma unidade de código fora do escopo.
CREATE OR REPLACE TRIGGER my_trigger
AFTER
UPDATE
ON my_table
FOR EACH ROW
BEGIN
NULL;
END;
Exemplos de unidades de código de nível superior¶
Na seção a seguir, podemos ver alguns exemplos de unidades de código de nível superior.
Consultas¶
No exemplo a seguir, temos aqui uma única instrução SELECT. Essa instrução é uma única unidade de código de nível superior.
SELECT * FROM table1;
Neste exemplo, temos uma instrução SELECT
aninhada dentro de outra instrução SELECT
. A consulta inteira conta como uma única unidade de código de nível superior.
SELECT * FROM (SELECT * FROM table1);
Objetos¶
Os objetos criados com um DDL contam como uma única unidade de código de nível superior, mesmo que contenham outras unidades de código em seu interior.
A instrução a seguir cria uma exibição com uma consulta. Nesse caso, CREATE VIEW
inteiro conta como uma única unidade de código de nível superior.
CREATE VIEW view1 AS SELECT * FROM table1;
A seguinte instrução CREATE PROCEDURE
conta como uma única unidade de código de nível superior, mesmo que contenha vários comandos dentro dele.
CREATE PROCEDURE procedure1
AS
BEGIN
DELETE FROM table1;
END;
Comandos¶
Os comandos independentes em um arquivo SQL são considerados unidades de código de nível superior.
Uma instrução COMMIT
conta como uma única unidade de código de nível superior.
COMMIT;
Corpos de pacotes no Oracle¶
Um pacote pode definir vários elementos dentro de seu corpo. O corpo do pacote é considerado a unidade de código de nível superior porque esses elementos não podem ser criados individualmente sem a criação de todo o corpo do pacote. Os elementos ou unidades de código dentro do corpo de um pacote não contarão como unidades de código de nível superior.
O código a seguir será relatado como uma única unidade de código CREATE PACKAGE BODY
.
CREATE PACKAGE package_body1 IS
FUNCTION function1
RETURN VARCHAR
IS
BEGIN
RETURN 'HELLO'';
END;
END;
Arquivos de script do Teradata¶
Os arquivos de Script do Teradata, como BTEQ ou TPUMP, são executados como unidades de código autônomas. Por esse motivo, o arquivo inteiro é considerado uma única unidade de código de nível superior. Outras unidades de código possíveis dentro desses arquivos não contarão como unidades de código de nível superior.
O seguinte arquivo de script BTEQ será relatado como uma única unidade de código de nível superior BTEQ.
.LOGON e/fml,notebook
.COMPILE FILE = example.spl;
COMMIT;
CALL samplesp1 (8888, pAmount);
.LOGOFF
Transacionar lotes SQL com GOTO¶
Cada instrução do Transact-SQL pode ser executada de forma independente. Na maioria dos casos, cada uma dessas instruções é considerada uma unidade de código de nível superior. No entanto, quando há um lote que contém uma instrução GOTO para um rótulo dentro do mesmo lote, as instruções do lote não podem ser executadas independentemente sem garantir que funcionem corretamente. Por esse motivo, as instruções que estiverem em um lote com uma instrução GOTO não contarão como unidades de código de nível superior, apenas o lote.
O exemplo de código a seguir será relatado como uma única unidade de código 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
Como a metodologia da Unidade de Código é representada em outros relatórios?¶
A metodologia da Unidade de Código também está representada em outros relatórios. Esta seção explica como esses valores são mostrados ou estão relacionados a outros relatórios.
Relatório de problemas¶
Cada linha do Relatório de problemas contém algumas informações sobre a Unidade de código que está sendo afetada pelo problema. As colunas relacionadas às unidades de código são as seguintes:
Code Unit Database: Esse é o banco de dados da unidade de código de nível superior em que o problema foi encontrado. Isso se aplica apenas a unidades de código que são objetos.
Code Unit Schema: Esse é o esquema da unidade de código de nível superior em que o problema foi encontrado. Isso se aplica apenas a unidades de código que são objetos.
Code Unit Package: Este é o pacote da unidade de código de nível superior em que o problema foi encontrado. Isso se aplica apenas a unidades de código que são objetos.
Code Unit Name: Esse é o nome da unidade de código de nível superior em que o problema foi encontrado. Isso se aplica apenas a unidades de código nomeadas, como objetos. Esse nome não é qualificado por banco de dados, esquema ou pacote.
Code Unit ID: Este é o ID da unidade de código de nível superior onde o problema foi encontrado. Esse nome tem o nome qualificado e adicionará um número para unidades de código com nomes repetidos.
Code Unit: Esse é o tipo da unidade de código de nível superior em que o problema foi encontrado.
Code Unit Size: Esse é o tamanho da unidade de código de nível superior em que o problema foi encontrado.
Relatório de referências a objetos e relatório de objetos ausentes¶
Cada linha do relatório Object References contém informações sobre a unidade de código de nível superior que estava fazendo referência a outro elemento. Esses elementos referenciados podem não ser de nível superior, portanto, esses outros valores podem não ser incluídos no relatório Top-Level Code Units.
Da mesma forma que o relatório Object References, o relatório Missing Objects contém informações sobre a unidade de código de nível superior que fazia referência a um elemento que não podia ser encontrado no código.
Caller Code Unit: Esse é o tipo da unidade de código de nível superior que está fazendo referência a outro elemento.
Caller Code Unit Database: Esse é o banco de dados da unidade de código de nível superior que está fazendo referência a outro elemento.
Caller Code Unit Schema: Esse é o esquema da unidade de código de nível superior que está fazendo referência a outro elemento.
Caller Code Unit Name: Esse é o nome da unidade de código de nível superior que está fazendo referência a outro elemento.
Caller Code Unit Full Name: Este é o nome completo da unidade de código de nível superior que está fazendo referência a outro elemento.
Informações no relatório Top-Level Code Units¶
Coluna |
Descrição |
---|---|
Chave de partição |
O identificador exclusivo da conversão. |
Tipo de arquivo |
O tipo de arquivo em que a unidade de código está. (SQL, BTEQ, etc…) |
Categoria |
A classe ou o tipo mais amplo a que cada unidade de código pertence. |
Code Unit |
O tipo de unidade de código ao qual esse elemento pertence. |
Code Unit Name |
O nome da unidade de código, se houver uma, como tabelas ou procedimentos. Será N/A para elementos sem um nome como DMLs. |
Nome do arquivo |
O nome do arquivo no qual o objeto está localizado. Usa o caminho relativo a partir do diretório de entrada. |
Line Number |
O número da linha dentro do arquivo em que a unidade de código está localizada. |
Linhas de código |
O total de linhas de código que a unidade de código tem. |
EWI Count |
A quantidade de EWIs encontrada na unidade de código. Você pode saber mais sobre EWIs aqui. |
FDM Count |
A quantidade de FDMs encontrada na unidade de código. Você pode saber mais sobre FDMs aqui. |
PRF Count |
A quantidade de PRFs encontrada na unidade de código. Você pode saber mais sobre PRFs aqui. |
Highest EWI Severity |
<p>O EWI com maior gravidade encontrado na unidade de código.<br>A ordem de gravidade é a seguinte:</p><ul><li>N/A (quando não há nenhum EWIs)</li><li>Low</li><li>Medium</li><li>High</li><li>Critical</li></ul> |
UDFs Used |
Os nomes de todas as funções definidas pelo usuário encontradas na unidade de código. O nome dos UDFs usado é separado por um pipe se houver mais de um. |
EWI |
Os códigos de todos os EWIs encontrados na unidade de código. Esses códigos são separados por pipes e não incluem códigos repetidos. |
FDM |
Os códigos de todos os FDMs encontrados na unidade de código. Esses códigos são separados por pipes e não incluem códigos repetidos. |
PRF |
Os códigos de todos os PRFs encontrados na unidade de código. Esses códigos são separados por pipes e não incluem códigos repetidos. |
Status da conversão |
<p>O status final da conversão da unidade de código.</p><p>Os possíveis status de conversão são:</p><ul><li>NotSupported: Quando a unidade de código tem uma taxa de conversão de 0%.</li><li>Partial: Quando a taxa de conversão da unidade de código está entre 0% e 100%.</li><li>Success: Quando a taxa de conversão da unidade de código é de 100%.</li></ul> |
LoC Conversion Percentage |
A porcentagem de conversão é baseada em linhas de código. Uma única linha de código pode ter fragmentos compatíveis e não compatíveis, dependendo de como o código de entrada foi formatado. Nesses casos, a linha inteira é considerada não compatível. |
Exemplo¶
Suponha que o seguinte CREATE TABLE
em ORACLE SQL esteja localizado em seu arquivo chamado 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"}}'
;
O relatório Top-Level Code Units terá uma única entrada da tabela mostrada anteriormente.
Aqui estão todos os valores que seriam informados na entrada dessa instrução CREATE TABLE
:
O valor de Partition Key dependerá da migração, portanto, o valor aqui poderá variar.
O File Type será SQL porque foi migrado em um arquivo com a extensão .sql.
A Category será TABLE porque a instrução
CREATE TABLE
faz parte da categoria de unidade de código TABLE.A Code Unit em si será
CREATE TABLE
.O File Name onde essa unidade de código foi encontrada seria table_example.sql.
Supondo que a instrução
CREATE TABLE
esteja no início do arquivo, o número da linha será 1.O número de linhas de código seria 4.
A coluna EWI Count informará 1 porque o código de saída tem um EWI de análise.
A coluna FDM Count informará 1 porque o código de saída tem um problema FDM relacionado a tipos de dados.
O PRF Count informará 0 porque não há problemas de PRF presentes no código de saída.
O Highest EWI Severity nesse caso seria «Critical» porque essa é a gravidade da análise de EWI do exemplo. O outro tem uma gravidade «Low».
A coluna UDFs Used será
JULIAN_TO_GREGORIAN_DATE_UDF
porque essa Função Definida pelo Usuário personalizada foi adicionada para converter a funçãoTO_DATE
do código de entrada.A coluna EWI informará «SSC-EWI-0001» porque esse foi um dos EWIs adicionados no código de saída.
A coluna FDM informará «SSC-FDM-OR0042» porque esse foi um dos FDMs adicionados no código de saída.
A coluna PRF informará «N/A» porque não há problemas de PRF presentes no código de saída.
O Conversion Status será «Partial» porque apenas alguns fragmentos dessa unidade de código puderam ser migrados sem EWIs.
A LoC Conversion Percentage é de 50% porque, de 4 linhas, apenas 2 foram convertidas com sucesso.