Ich beginne zuerst mit der einfacheren Frage: Wie findet man eigentlich die SQL Id – der sogenannte "SQL Identifier"– eines SQL-Statements?
Diese Anforderung stellt sich immer wieder, wenn es um SQL-Tuning oder Monitoring geht.
Die Antwort hierauf ist einfach: Die SQL Id lässt sich beispielsweise aus AWR- oder ASH-Berichten selektieren oder man verwendet die Spalte namens SQL_ID in den verschiedenen Data Dictionary Views. In SQL*Plus bietet sich ab der Oracle-Datenbank Version 18c sogar eine weitere Lösung an. Mit dem Kommando "SET FEEDBACK ON SQL_ID" wird die SQL_ID automatisch nach einer Statement-Ausführung ausgegeben.
SQL> set feedback on SQL_ID
SQL> select sysdate from dual;
SYSDATE
--------------------------
04-May-2022 09:48:03
1 row selected.
SQL_ID: 7h35uxf5uhmm1
Aber wie lautet jetzt die Antwort auf meine ursprüngliche Frage: Gibt es eine Möglichkeit, die SQL Id zu erhalten, OHNE das SQL-Statement vorher auszuführen?
Das PL/SQL-Package DBMS_SQL_TRANSLATOR macht es möglich. Seit Oracle Database 12c gibt es einen Übersetzungs-Mechanismus namens SQL Translation Framework, der die SQL-Anweisungen eines Client-Programms von einem fremden (nicht-Oracle) SQL-Dialekt in den vom SQL-Compiler der Oracle Database verwendeten SQL-Dialekt übersetzt. Das Package DBMS_SQL_TRANSLATOR liefert die Schnittstelle zum Erstellen, Konfigurieren und Verwenden der sogenannten SQL-Translation-Profile. Überprüft man die zugehörigen Funktionen und Prozeduren in der Dokumentation, findet man eine Funktion mit dem vielversprechenden Namen SQL_ID, die auch ohne Translation-Profile verwendet werden kann.
Sie berechnet die SQL Id mit einem einzigen Aufruf, wie das folgende Beispiel zeigt:
SQL> set serveroutput on
SQL> r
1 declare
2 p_id varchar2(1000);
3 begin
4 p_id:=dbms_sql_translator.sql_id('select sysdate from dual');
5 dbms_output.put_line(p_id);
6* end;
7h35uxf5uhmm1
PL/SQL procedure successfully completed.
Fertig! So einfach geht das. Mit diesem kleinen Trick lässt sich die SQL Id ohne Ausführung ausgeben.
Ulrike Schwinn

