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