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

Menjalankan pernyataan sql dinamis menjadi SYS_REFCURSOR

anda harus mengikat parameter pAge dan pPostcode . Dalam SQL dinamis Anda akan mengawalinya dengan titik dua (: ). Jika Anda menggunakan EXECUTE IMMEDIATE atau OPEN ... FOR , Anda akan mengikat parameter Anda melalui posisi, inilah mengapa saya menamainya :P1 dan :P2 dalam contoh:

DECLARE
   lsql VARCHAR2(500) := 'SELECT c.id 
                            FROM carer c, cared_for cf, carer_cared_for ccf 
                           WHERE c.id = ccf.carer_id (+)
                             AND cf.id (+) = ccf.cared_for_id';
BEGIN
   IF pPostcode IS NULL THEN
      lsql := lsql || ' AND :P1 IS NULL';
   ELSE
      lsql := lsql || ' AND c.postcode like ''%''|| upper(:P1)||''%''';
   IF pPostcode pAge > 0 THEN
      lsql := lsql || ' AND :P2 = ROUND((MONTHS_BETWEEN(sysdate,
                                                        c.date_of_birth)/12))';
   ELSE
      lsql := lsql || ' AND nvl(:P2, -1) <= 0';
   END IF;
   OPEN pReport FOR lsql USING pPostcode, pAge;
END;

Catatan:Jumlah dan posisi variabel bind harus diketahui pada waktu kompilasi , inilah mengapa saya sering menggunakan konstruk di atas (menambahkan parameter ke posisinya meskipun tidak digunakan). Menambahkan tautologi (seperti pada AND :P1 IS NULL ) ke kueri tidak akan memengaruhi rencana penjelasannya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PEMBARUAN tentang tampilan pelestarian kunci di Oracle memunculkan ORA-01779

  2. Matriks Versi yang Didukung Oracle

  3. Biaya kueri:Tabel Sementara Global vs. Koleksi (Array Virtual)

  4. Reader.Read() gagal membaca baris meskipun memiliki baris

  5. Permintaan SQL untuk menghitung perubahan nilai dalam kolom