Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

SQL Dinamis - Periksa sintaks dan semantik

EXPLAIN PLAN akan memeriksa sintaks dan semantik dari hampir semua jenis pernyataan SQL. Dan tidak seperti DBMS_SQL.PARSE itu tidak akan mengeksekusi apa pun secara implisit.

Inti dari rencana penjelasan adalah untuk menunjukkan bagaimana Oracle akan mengeksekusi sebuah pernyataan. Sebagai efek samping dari pembuatan rencana itu juga harus memeriksa sintaks, hak istimewa, dan umumnya melakukan segalanya kecuali benar-benar menjalankan pernyataan. Rencana penjelasan itu sendiri tidak ada gunanya dan dapat diabaikan, pernyataan itu hanya dijalankan untuk memeriksa kesalahan apa pun. Selama tidak ada kesalahan, pernyataan tersebut valid.

Misalnya, blok PL/SQL di bawah ini memeriksa validitas SELECT pernyataan dan CREATE TABLE penyataan. Mereka berjalan tanpa kesalahan sehingga sintaksnya baik-baik saja.

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

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

Menjalankan pernyataan yang buruk akan menghasilkan kesalahan. Setidaknya dalam satu kasus uji ini, ini menghasilkan kesalahan yang sama seperti jika pernyataan dijalankan dengan sendirinya.

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 sintaks dalam manual menyiratkan itu harus dijalankan untuk semua pernyataan. Namun, tampaknya ada setidaknya beberapa jenis pernyataan yang tidak berfungsi, seperti 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

Sedikit di luar topik - apakah Anda mencoba membangun antarmuka SQL yang sepenuhnya generik, seperti SQL Fiddle pribadi yang dibangun di PL/SQL? Apakah Anda perlu khawatir tentang hal-hal seperti mencegah pengguna mencoba menjalankan jenis pernyataan tertentu, dan memastikan tidak ada tanda titik koma? Jika demikian, saya dapat mengedit pertanyaan untuk membantu beberapa tugas SQL dinamis yang sulit.



  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:Hapus dari bawah ke atas

  2. Bagaimana cara memeriksa apakah file ada di PL/SQL?

  3. Masalah hibernasi dengan Oracle Trigger untuk menghasilkan id dari urutan

  4. Oracle 12c:Bagaimana saya bisa mengubah kolom kunci utama yang ada menjadi kolom identitas?

  5. Melarikan diri dari wildcard di LIKE