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

Mengapa EXECUTE IMMEDIATE diperlukan di sini?

Seluruh blok PL/SQL diuraikan pada waktu kompilasi, tetapi teks dalam pernyataan dinamis tidak dievaluasi sampai runtime. (Mereka hampir sama untuk blok anonim, tetapi langkahnya masih berbeda).

If/else Anda juga tidak dievaluasi sampai runtime. Kompilator tidak mengetahui bahwa tabel akan selalu ada pada saat Anda melakukan penyisipan, ia hanya dapat memeriksa apakah tabel itu ada atau tidak pada saat ia mem-parsing seluruh blok.

Jika tabel sudah ada maka tidak apa-apa; kompiler dapat melihatnya, blok dijalankan, pilihan Anda mendapat 1, dan Anda masuk ke yang lain untuk melakukan penyisipan. Tetapi jika tidak ada maka penguraian sisipan dengan benar gagal dengan ORA-00942 pada waktu kompilasi dan tidak ada apa pun di blok yang dieksekusi.

Karena pembuatan tabel bersifat dinamis, semua referensi ke tabel juga harus dinamis - sisipan Anda seperti yang Anda lihat, tetapi juga jika Anda kemudian menanyakannya. Pada dasarnya itu membuat kode Anda lebih sulit untuk dibaca dan dapat menyembunyikan kesalahan sintaks - karena kode dinamis tidak diuraikan hingga waktu proses, dan mungkin Anda dapat memiliki kesalahan dalam pernyataan dinamis di cabang yang tidak terkena lama.

Tabel sementara global tidak boleh dibuat saat itu juga. Mereka adalah objek permanen dengan data sementara, khusus untuk setiap sesi, dan tidak boleh dibuat/dihapus sebagai bagian dari kode aplikasi Anda. (Tidak ada perubahan skema yang harus dilakukan oleh aplikasi Anda secara umum; perubahan itu harus dibatasi pada perubahan peningkatan/pemeliharaan dan dikontrol, untuk menghindari kesalahan, kehilangan data, dan efek samping yang tidak terduga; GTT tidak berbeda).

Tidak seperti tabel sementara di beberapa database relasional lainnya, saat Anda membuat tabel sementara di database Oracle, Anda membuat definisi tabel statis. Tabel sementara adalah objek persisten yang dijelaskan dalam kamus data, tetapi tampak kosong hingga sesi Anda memasukkan data ke dalam tabel. Anda membuat tabel sementara untuk database itu sendiri, bukan untuk setiap prosedur tersimpan PL/SQL.

Buat GTT sekali dan buat semua kode PL/SQL Anda statis. Jika Anda menginginkan sesuatu yang lebih dekat dengan tabel sementara lokal SQL Server, lihat koleksi PL/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. Fungsi SYSTIMESTAMP di Oracle

  2. Pengantar Koleksi PL/SQL Di Database Oracle

  3. Bagaimana saya bisa menghindari kesalahan panjang variabel mentah yang terlalu panjang di SQL Developer?

  4. Dapatkan PANJANG dari RAW PANJANG

  5. Perbedaan antara VARCHAR2(10 CHAR) dan NVARCHAR2(10)