Akar penyebabnya
Di Oracle Anda memiliki tiga jenis pernyataan SQL (dan juga ada blok PL/SQL):
- Pernyataan dalam Bahasa Definisi Data (DDL). Pernyataan-pernyataan ini memodifikasi struktur database. Mereka biasanya mulai dengan kata kerja "ALTER" atau "CREATE"
- Pernyataan dalam Bahasa Modifikasi Data (DML). Pernyataan di sana memodifikasi konten di dalam tabel, membiarkan struktur setiap tabel tidak dimodifikasi. Pernyataan ini biasanya dimulai dengan "INSERT", "MERGE" atau "DELETE".
- Pernyataan dalam apa yang saya sebut "bahasa kueri" (sepertinya tidak ada nama kanonik untuk ini). Pernyataan ini dimulai dengan kata kerja "PILIH".
Variabel binding di Oracle hanya diperbolehkan di beberapa tempat khusus di DML dan pernyataan kueri. Anda mencoba menggunakan variabel bind di tempat yang tidak mengizinkannya. Karenanya kesalahannya.
Solusi
Bangun pernyataan Anda tanpa variabel pengikat. Buat string kueri lengkap alih-alih menggunakan rangkaian string.
Jika Anda ingin membersihkan input sebelum menggabungkan string, gunakan paket DBMS_ASSERT.
Latar Belakang
Variabel bind hanya dapat digunakan ketika Oracle dapat membuat rencana kueri tanpa mengetahui nilai variabel. Untuk pernyataan DDL, tidak ada rencana kueri. Oleh karena itu, variabel ikat tidak diperbolehkan.
Dalam pernyataan DML dan kueri, variabel ikat hanya diperbolehkan, bila digunakan di dalam tuple (mengenai teori himpunan yang mendasarinya), yaitu ketika nilai akan dibandingkan dengan nilai dalam tabel atau saat nilai akan dimasukkan ke dalam tabel . Mereka tidak diperbolehkan untuk mengubah struktur rencana eksekusi (misalnya mengubah tabel target atau mengubah jumlah perbandingan).