Database Reference
In-Depth Information
rechnet auch den MD5-Hashwert und den alten Hashwert. Sie können diese Funktion tes-
ten. Vergessen Sie dabei nicht, den SQL-Text mit dem Zeichen CHR(0) für das Zeilenende
zu ergänzen, sonst bekommen Sie einen fehlerhaften Hashwert.
SQL> prompt Tests with computing of sql_id and hash_value
Tests with computing of sql_id and hash_value
SQL>
SQL>declare
2 v_sqltext varchar2(32767):= 'select count(*) from tab$ where obj# between 10000 and
10000000';
3 n_num number;
4 md5_hash raw(20);
5 b_num number;
6 begin
7 n_num:=dbms_utility.get_sql_hash(v_sqltext||chr(0), md5_hash, b_num);
8 dbms_output.put_line('hash_value = '||n_num||', old_hash_value = '||b_num||', MD5 hash
value (16 bytes) = '||md5_hash);
9 end;
10 /
hash_value = 2018143629, old_hash_value = 4089831428, MD5 hash value (16 bytes)
= 7ABC5CBF6CCDB7722809D6A08D6D4A78
PL/SQL-Prozedur erfolgreich abgeschlossen.
Zugleich mit dem neuen Hashwert des SQL-Textes erschien die SQL Id in 10g. Leider
findet man praktisch keine Informationen zum Aufbau der SQL Id in der Dokumentation
von Oracle. Es besteht auch keine Standard-Funktion für die Berechnung der SQL Id. Was
ist eigentlich die SQL Id? Trotz ihrer etwas ungewöhnlichen Gestaltung ist die SQL Id auch
nichts anderes als ein Hashwert. Von einem Hashwert erwartet man aber, dass er numme-
risch ist. Die SQL Id ist ja auch eine Zahl, die einfach in dem 32-er System dargestellt ist.
In diesem System werden 32 Ziffern benutzt (von 0 bis 31 in Dezimaldarstellung). Für eine
kompaktere Darstellung dieser 32 Ziffern verwendet man dezimale Ziffern und Buchsta-
ben (wie für die Hexadezimaldarstellung). Da man für eine solche Darstellung wesentlich
mehr Buchstaben braucht als für die Hexadezimaldarstellung, sieht die SQL Id etwas ge-
heimnisvoll aus.
Man kann verschiedenermaßen Ziffern im 32-er System kodieren. Oracle benutzt die
folgende Zeichenreihe für die Darstellung dieser Ziffern: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, f,
g, h, j, k, m, n, p, q, r, s, t, u, v, w, x, y, z. Alle in dieser Folge fehlenden Buchstaben kommen
in keiner SQL Id vor.
Während die letzten 4 Bytes vom MD5-Hashwert für den Hashwert des SQL-Textes
benutzt werden, nimmt Oracle die letzten 8 Bytes von MD5-Hashwert für die SQL Id. Ein
Hashwert des SQL-Textes ist also ein Teil der SQL Id. Aus diesem Grund ist es möglich,
diesen Hashwert anhand von der SQL Id zu berechnen (aber nicht umgekehrt!). Für diesen
Search WWH ::




Custom Search