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