Database Reference
In-Depth Information
SQL>declare
2 v_num integer;
3 v_sqltext clob := 'select count(*) from tab$ where obj# between 10000 and 10000000';
4 v_sqlid varchar2(20);
5
6 function conv_to_base32( in_int in integer ) return varchar2 is
7 v_div integer := in_int;
8 v_mod integer;
9 v_base32 varchar2(32767);
10 begin
11 while v_div>= 32 loop
12
v_mod := floor(mod(v_div, 32));
13
v_div := floor(v_div / 32);
14
v_base32 := substr('0123456789abcdfghjkmnpqrstuvwxyz',v_mod + 1,1) ||
v_base32;
15 end loop;
16
17 v_base32 := substr('0123456789abcdfghjkmnpqrstuvwxyz',v_div + 1,1) || v_base32;
18
19 return(v_base32);
20
21 end conv_to_base32;
22
23 begin
24 v_num := to_number(sys.UTL_RAW.reverse(sys.UTL_RAW.SUBSTR(sys.dbms_crypto.hash(src
=>v_sqltext||chr(0), typ => 2),9,4))
||sys.UTL_RAW.reverse(sys.UTL_RAW.SUBSTR(sys.dbms_crypto.hash(src =>v_sqltext||chr(0), typ =>
2),13,4)),'xxxxxxxxxxxxxxxx');
25 dbms_output.put_line('computed sql_id = '||conv_to_base32(v_num));
26 v_num := to_number(sys.UTL_RAW.reverse(sys.UTL_RAW.SUBSTR(sys.dbms_crypto.hash(src
=>v_sqltext||chr(0), typ =>2),13,4)),'xxxxxxxx');
27 dbms_output.put_line('computed hash_value = '||v_num);
28 end;
29 /
computed sql_id = a1ph951w4nvcd
computed hash_value = 2018143629
PL/SQL-Prozedur erfolgreich abgeschlossen.
Das einzige nicht besprochene Detail dieses Algorithmus ist die Umdrehung der Bytes in
jedem der letzten beiden 4-bytigen Wörter des MD5-Hashwertes. Dafür werden jeweils die
Funktionen UTL_RAW.REVERSE und UTL_RAW.SUBSTR benutzt.
Wie kann man die SQL Id und den Hashwert des SQL-Textes in der Praxis gebrauchen?
Jede SQL-Anweisung hinterlässt seine Spuren in Form von der SQL Id und von dem Hash-
wert in den internen Views und Tabellen von Oracle. Da diese beiden Werte praktisch ein-
deutig den SQL-Text identifizieren, kann man sie für die Suche nach SQL-Anweisungen
benutzen (z. B. in der View V$SQL oder in der View V$SQL_SHARED_CURSOR). Man
kann auch auf der Basis der SQL Id (oder des Hashwertes) schnell prüfen, ob 2 SQL-Texte
unterschiedlich sind. In diesem Fall sind die jeweiligen SQL Ids (oder die Hashwerte) auch
Search WWH ::




Custom Search