Mengapa kita tidak bisa menulis pernyataan ddl langsung ke blok PL / SQL

11

Mengapa kita tidak bisa menulis pernyataan ddl langsung di blok PL / SQL, misalnya ketika saya menulis

CREATE OR REPLACE PROCEDURE test IS
BEGIN
    truncate table table_name; // error
END test;
/

Tapi,

CREATE OR REPLACE PROCEDURE test IS
BEGIN
    execute immediate 'truncate table table_name'; // works fine
END test;
/

Mengapa yang kedua berhasil dijalankan?

Ravi
sumber

Jawaban:

7

Seperti yang tertulis di dokumentasi :

Hanya SQL dinamis yang dapat menjalankan jenis pernyataan berikut dalam unit program PL / SQL:

  • Pernyataan bahasa definisi data (DDL) seperti CREATE, DROP, GRANT, dan REVOKE

Sebuah TRUNCATEoperasi DDL.

Saat menggunakan EXECUTE IMMEDIATE, ingatlah bahwa setiap DDLoperasi yang Anda lakukan akan secara implisit COMMITtransaksi saat ini.

Philᵀᴹ
sumber
1

DDL di dalam PL / kode SQL lebih pengecualian dari kebutuhan nyata. Parse dapat dilihat sebagai verifikasi struktur, yang hilang jika struktur Anda berubah pada eksekusi. Prosedur dimaksudkan untuk mem-parsing lagi objek lain (tabel, atau kode pl / sql lainnya, tampilan dll). Setiap kali tergantung perubahan objek, itu harus dikompilasi ulang. Jadi, membuat kode parsing dari sesuatu selain struktur perubahan tidak dapat diverifikasi dan karenanya dikompilasi. Pertimbangkan kasusnya

DROP TABLE T1;

Selama waktu parse, tabel akan ditemukan dan prosedur berhasil dikompilasi tetapi pada eksekusi 1, tabel dijatuhkan dan kode Anda tidak valid lagi (waktu berikutnya DROP TABLE akan menghasilkan kesalahan). Demikian pula, setiap perubahan pada tabel DDL akan membuat kebutuhan untuk mengkompilasi ulang, sehingga kehilangan keuntungan dari penguraian kode.

igr
sumber