Wie findet man die SQL_ID eines SQL-Statements? Eine Frage, die sich immer wieder in der Praxis stellt. Die Auswahl an Lösungs-Möglichkeiten ist groß: So kann man die SQL_ID in AWR- oder ASH-Reports finden oder aus V$-Views wie V$SQL selektieren.
SQL*Plus in Oracle Database 18c (und später natürlich) liefert sogar eine ganz einfache Lösung. Mit “SET FEEDBACK ON SQL_ID” lässt sich ganz automatisch die SQL_ID nach der Statement-Ausführung ausgeben. Folgendes Beispiel zeigt die einfache Verwendung:
SQL> set feedback on SQL_ID SQL> select sysdate from dual; SYSDATE --------------- 19-JUL-21 1 row selected. SQL_ID: 7h35uxf5uhmm1 SQL> define _sql_id DEFINE _SQL_ID = "7h35uxf5uhmm1" (CHAR)
Die SQL_ID wird dabei der vordefinierten SQL*Plus Variable _SQL_ID zugewiesen. Diese Variable kann dabei wie jede andere vordefinierte Variable verwendet werden, wie man in folgendem Beispiel sehen kann.
SQL> SELECT sql_text FROM v$sql WHERE sql_id = '&_sql_id'; old 1: SELECT sql_text FROM v$sql WHERE sql_id = '&_sql_id' new 1: SELECT sql_text FROM v$sql WHERE sql_id = '7h35uxf5uhmm1' SQL_TEXT ----------------------------------------------- select sysdate from dual 1 row selected.
Die Fragestellungen kann aber auch folgendermaßen lauten:
Gibt es eine Möglichkeit die SQL_ID eines Statements zu erhalten, OHNE vorher das Statement auszuführen? Auch dazu kann man eine Lösung finden – nämlich im Oracle PL/SQL Package Framework: DBMS_SQL_TRANSLATOR “did the trick” – wie der Amerikaner sagen würde 😉
Wozu verwendet man eigentlich DBMS_SQL_TRANSLATOR? Das Package gehört zu dem in Oracle 12c eingeführten SQL Translation Framework. Es mappt die SQL-Statements eines Client-Programms von einem fremden (nicht-Oracle) SQL-Dialekt auf den von der Oracle-Datenbank verwendeten SQL-Dialekt. Das Package DBMS_SQL_TRANSLATOR bietet dabei die Schnittstelle zum Erstellen, Konfigurieren und Verwenden von sogenannten SQL-Translation Profiles. Durchsucht man die Funkionen und Prozeduren findet man eine Funktion mit Namen SQL_ID, die die SQL_ID einer SQL-Anweisung in einem SQL-Translation Profile berechnet. Sie lässt sich ohne Translation Profile verwenden und berechnet mit einem einzigen Aufruf die zugehörige SQL_ID zu einem SQL Statement.
Der Test mit unserem kurzen Beispiel zeigt die Funktionalität.
SQL> declare
p_id varchar2(1000);
begin
p_id:=dbms_sql_translator.sql_id('select sysdate from dual');
dbms_output.put_line(p_id);
end;
/
7h35uxf5uhmm1
Das Problem ist damit gelöst.
Übrigens googelt man ein wenig, findet man im Posting “Function to compute SQL_ID out of SQL_TEXT” von Carlos Sierra sogar ein PL/SQL-Skript, um die SQL_ID aus dem SQL_TEXT zu berechnen. Getestet in 21c liefert der PL/SQL-Code das korrekte Ergebnis. 🙂
