Controlando versões de código PL/SQL com a função GET_HASH_VALUE

Controlando versões de código PL/SQL com a função GET_HASH_VALUE

A função GET_HASH_VALUE, da package DBMS_UTILITY, permite gerar um hash do código fonte PL/SQL sendo útil para versionamento e também identificar se houve alteração no código entre as bases de dados.

 

Criando a Stored Procedure SP_HASH_1 na instância padp:


Conectado a:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Advanced Analytics and Real Application Testing options

SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
padp

SQL> CREATE OR REPLACE PROCEDURE SP_HASH_1
2 as
3 begin
4 dbms_output.put_line('EXAMPLO_HASH_1');
5 end;
6 /

Procedimento criado.

 

O código hash da Procedure SP_HASH_1 é o 1799235650.


SQL> select name,avg(dbms_utility.get_hash_value(text,1000000000,power(2,30))) as hash_value
2 from dba_source
3 where name = 'SP_HASH_1'
4 group by name;

NAME HASH_VALUE
-------------- ----------
SP_HASH_1 1799235650

Criando o mesmo código PL/SQL na instância hadp obtivemos o mesmo código hash 1799235650.


Conectado a:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Advanced Analytics and Real Application Testing options

SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
hadp

SQL> CREATE OR REPLACE PROCEDURE SP_HASH_1
2 as
3 begin
4 dbms_output.put_line('EXAMPLO_HASH_1');
5 end;
6 /

Procedimento criado.

SQL> select name,avg(dbms_utility.get_hash_value(text,1000000000,power(2,30))) as hash_value
2 from dba_source
3 where name = 'SP_HASH_1'
4 group by name;

NAME HASH_VALUE
--------------- ----------
SP_HASH_1 1799235650

Agora fiz uma alteração no código substituindo a saída da package DBMS_OUTPUT.PUT_LINE de “EXAMPLO_HASH_1” para “EXAMPLO_HASH_2” e o valor do hash mudou para 1837593048.


SQL> CREATE OR REPLACE PROCEDURE SP_HASH_1
2 as
3 begin
4 dbms_output.put_line('EXAMPLO_HASH_2');
5 end;
6 /

Procedimento criado.

SQL> select name,avg(dbms_utility.get_hash_value(text,1000000000,power(2,30))) as hash_value
2 from dba_source
3 where name = 'SP_HASH_1'
4 group by name;

NAME HASH_VALUE
---------------- ----------
SP_HASH_1 1837593048

 

Alterei a Procedure para o código inicial “dbms_output.put_line(‘EXAMPLO_HASH_1’)” e voltamos a ter o mesmo hash (1799235650) entre as instância padp e hadp:


SQL> CREATE OR REPLACE PROCEDURE SP_HASH_1
2 as
3 begin
4 dbms_output.put_line('EXAMPLO_HASH_1');
5 end;
6 /

Procedimento criado.

SQL> select name,avg(dbms_utility.get_hash_value(text,1000000000,power(2,30))) as hash_value
2 from dba_source
3 where name = 'SP_HASH_1'
4 group by name;

NAME HASH_VALUE
-------------- ----------
SP_HASH_1 1799235650