Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Dynamiczny SQL - Sprawdź składnię i semantykę

EXPLAIN PLAN sprawdzi składnię i semantykę prawie wszystkich typów instrukcji SQL. I w przeciwieństwie do DBMS_SQL.PARSE nie wykona niczego domyślnie.

Celem planu wyjaśniania jest pokazanie, w jaki sposób Oracle wykona instrukcję. Jako efekt uboczny generowania planu musi również sprawdzić składnię, uprawnienia i ogólnie zrobić wszystko oprócz faktycznego uruchomienia instrukcji. Sam plan wyjaśniania jest bezcelowy i można go zignorować, instrukcja jest uruchamiana tylko w celu sprawdzenia ewentualnych błędów. Dopóki nie ma błędów, oświadczenie jest ważne.

Na przykład poniższe bloki PL/SQL sprawdzają poprawność SELECT oświadczenie i CREATE TABLE oświadczenie. Działają bezbłędnie, więc składnia jest w porządku.

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

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

Uruchomienie złej instrukcji wygeneruje błąd. Przynajmniej w tym jednym przypadku testowym generuje ten sam błąd, jakby instrukcja została uruchomiona sama.

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

Diagram składni w podręczniku sugeruje, że powinien działać dla wszystkich sprawozdania. Wydaje się jednak, że istnieje co najmniej kilka typów instrukcji, które nie działają, takie jak 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

Trochę nie na temat - czy próbujesz zbudować całkowicie ogólny interfejs SQL, jak prywatny SQL Fiddle zbudowany w PL/SQL? Czy musisz się martwić o takie rzeczy, jak uniemożliwienie użytkownikom prób uruchomienia niektórych typów instrukcji i upewnienie się, że nie ma końcowych średników? Jeśli tak, mogę edytować pytanie, aby pomóc w niektórych trudnych zadaniach dynamicznego SQL.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle:uzyskanie maksymalnej wartości grupy?

  2. Szybkie partycjonowanie

  3. Bezpieczeństwo baz danych w Oracle

  4. Nie można ponownie skojarzyć połączenia, ponieważ obiekty podrzędne są nadal otwarte

  5. Kursor PL/SQL dla pętli