Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Dynamisches SQL - Überprüfen Sie Syntax und Semantik

EXPLAIN PLAN überprüft die Syntax und Semantik fast aller Arten von SQL-Anweisungen. Und im Gegensatz zu DBMS_SQL.PARSE es wird nichts implizit ausgeführt.

Der Zweck des Erklärplans besteht darin, zu zeigen, wie Oracle eine Anweisung ausführt. Als Nebeneffekt der Erstellung des Plans muss es auch die Syntax und die Berechtigungen prüfen und im Allgemeinen alles tun, außer die Anweisung tatsächlich auszuführen. Der EXPLAIN-Plan selbst ist sinnlos und kann ignoriert werden, die Anweisung wird nur ausgeführt, um nach Fehlern zu suchen. Solange keine Fehler vorliegen, ist die Anweisung gültig.

Beispielsweise prüfen die folgenden PL/SQL-Blöcke die Gültigkeit eines SELECT -Anweisung und eine CREATE TABLE Aussage. Sie laufen ohne Fehler, also ist die Syntax in Ordnung.

begin
    execute immediate 'explain plan for select * from dual';
end;
/

begin
    execute immediate 'explain plan for create table just_some_table(a number)';
end;
/

Das Ausführen einer ungültigen Anweisung erzeugt einen Fehler. Zumindest in diesem einen Testfall generiert es den gleichen Fehler, als ob die Anweisung alleine ausgeführt würde.

begin
    execute immediate 'explain plan for select * from this_table_does_not_exist';
end;
/
ORA-00942: table or view does not exist
ORA-06512: at line 2

Das Syntaxdiagramm im Handbuch impliziert, dass es für alle ausgeführt werden sollte Aussagen. Es scheint jedoch zumindest einige Anweisungstypen zu geben, die nicht funktionieren, wie z. B. ALTER SESSION .

begin
    execute immediate 'explain plan for alter session set optimizer_features_enable = ''11.2.0.4''';
end;
/
ORA-00900: invalid SQL statement
ORA-06512: at line 2

Etwas abseits des Themas - versuchen Sie, eine vollständig generische SQL-Schnittstelle zu erstellen, wie eine private SQL-Fiddle, die in PL/SQL erstellt wurde? Müssen Sie sich Gedanken darüber machen, wie Sie verhindern, dass Benutzer versuchen, bestimmte Anweisungstypen auszuführen, und sicherstellen, dass keine nachgestellten Semikolons vorhanden sind? Wenn ja, kann ich die Frage bearbeiten, um bei einigen dieser schwierigen dynamischen SQL-Aufgaben zu helfen.