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

Oracle mengeksekusi langsung tidak mengeksekusi tanpa kesalahan

Alasan mengapa kode Anda tidak melakukan apa-apa adalah ini:

OPEN c1;
 LOOP
  EXIT WHEN c1%NOTFOUND;   
  EXIT WHEN (c1%ROWCOUNT <> p_SCBCount);
 

Anda sedang menguji c1%ROWCOUNT sebelum Anda menjalankan pengambilan. Jadi nilainya adalah 0; Saya menebak p_SCBCount tidak nol pada saat itu (karena Anda menginisialisasinya ke beberapa nilai di blok DECLARE) sehingga tes bernilai true dan program keluar.

Atau masalahnya adalah ini:

OPEN c1;
 LOOP
   ...
   FOR i in c1 LOOP
 

Kami tidak dapat menggunakan FOR ... IN dengan kursor eksplisit. Anda telah membuka kursor. Kemudian FOR mencoba membukanya lagi yang melemparkan ORA-06511: PL/SQL: cursor already open . Jika Anda tidak melihat kesalahan ini, Anda harus memiliki penangan pengecualian yang menekannya (mis. WHEN others then null; ).

Pada dasarnya loop luar sama sekali tidak perlu dan Anda harus membuangnya.

Kontrol loop eksplisit jarang diperlukan:cukup gunakan FOR ... IN buat dan biarkan Oracle mengontrol alurnya.

Juga tidak perlu adalah semua SQL dinamis. SQL bekerja dengan variabel sehingga Anda hanya perlu menulis SQL statis yang mereferensikan atribut kursor:

FOR i in (SELECT crs_cust.CUSTOMER_ID AS CUSTOMER_ID , subset.NEW_CUSTOMER_REFERENCE_ID AS CUSTOMER_REF_ID FROM CRS_CUSTOMERS crs_cust INNER JOIN DAY0_SUBSET subset ON crs_cust.CUSTOMER_ID=subset.CURRENT_CUSTOMER_ID ) LOOP UPDATE CRS_CUSTOMERS SET REF_ID = i.CUSTOMER_REF_ID WHERE CUSTOMER_ID = i.CUSTOMER_ID; p_TotalUpdatedCRS := p_TotalUpdatedCRS + 1; UPDATE CRS_REVIEWS SET REF_ID = i.CUSTOMER_REF_ID WHERE CUSTOMER_ID = i.CUSTOMER_ID; UPDATE CRS_EVENT SET REF_ID = i.CUSTOMER_REF_ID WHERE UNIQUE_ID = i.CUSTOMER_ID; UPDATE ALERT_HEADER SET CUSTOMER_SOURCE_REF_ID = i.CUSTOMER_REF_ID WHERE CUSTOMER_ID = i.CUSTOMER_ID; END LOOP; DBMS_OUTPUT.PUT_LINE ('The total updates to CRS table = ' || p_TotalUpdatedCRS);

Saya tidak yakin dengan tujuan c1%ROWCOUNT <> p_SCBCount . Firasat saya itu berlebihan, karena FOR LOOP mengontrol pengambilan dengan tepat. Sebenarnya saya menduga Anda menambahkannya untuk menghindari efek samping dari loop bersarang; dan saya menduga Anda hanya memperkenalkan loop bersarang karena Anda melemparkan kode asli PLS-00376: illegal EXIT/CONTINUE statement; it must appear inside a loop (hanya tebakan liar).

Namun, jika itu berfungsi untuk mengimplementasikan beberapa logika bisnis asli, Anda dapat menambahkannya ke dalam loop entah bagaimana.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-00942:tabel atau tampilan tidak ada - Oracle

  2. Nilai input pesan kesalahan Oracle tidak cukup lama

  3. Apakah Oracle mengizinkan opsi baca yang tidak dikomit?

  4. lihat semua data untuk baris duplikat di Oracle

  5. Menggunakan variabel ikat di SQL Plus dengan lebih dari satu baris yang dikembalikan?