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

Groovy Oracle Stored Proc - indeks kolom invaid

Kode berikut dapat membantu Anda mendapatkan variabel SYS_REFCURSOR dari blok anonim Oracle.

Kita harus fokus pada beberapa detail utama:

  1. Kelas groovy.sql.Sql tidak memiliki OutParameter yang sesuai dan kita buat secara manual sebagai CURSOR_PARAMETER dan berikan ke sql.call metode
  2. Pertimbangkan bahwa blok dimulai dengan {call DECLARE dan diakhiri dengan END } tanpa titik koma setelah END. Kalau tidak, kita bisa mendapatkan SQLException yang tidak dapat dikenali dengan baik di wajah.
  3. Tanda tanya ? di dalam sqlString adalah tempat untuk pengikatan parameter. Binding dibuat dalam urutan alami dengan mengambil nilai dari parametersList .
    • Dalam contoh ini kita memiliki satu-satunya pengikatan, jadi ? mengikat dengan CURSOR_PARAMETER memperlakukan nilai sebagai OUT parameter tipe yang diteruskan;
  4. Hanya ada satu masuk ke penutupan setelah sql.call dan ResultSet rs berikan baris kursor my_cur dideklarasikan dalam blok anonim.
  5. Kita dapat menyederhanakan sqlString dengan menggunakan fungsi yang mengembalikan SYS_REFCURSOR alih-alih prosedur dengan OUT parameter. Jadi bisa terlihat seperti ini "{call BEGIN ? := MY_FUNC(); END}" atau bahkan "{? = call MY_FUNC()}"
import groovy.sql.OutParameter
import groovy.sql.Sql
import oracle.jdbc.OracleTypes

import java.sql.ResultSet

def driver = 'oracle.jdbc.driver.OracleDriver'
def sql = Sql.newInstance('jdbc:oracle:thin:@my-server:1521:XXX', 'usr', 'psw', driver)

// special OutParameter for cursor type
OutParameter CURSOR_PARAMETER = new OutParameter() {
    public int getType() {
        return OracleTypes.CURSOR;
    }
};

// look at some ceremonial wrappers around anonymous block
String sqlString = """{call
    DECLARE
      my_cur SYS_REFCURSOR;
    BEGIN
        STORED_PROCEDURE_NAME(my_cur);
        ? := my_cur;
    END
}
""";

// the order of elements matches the order of bindings
def parametersList = [CURSOR_PARAMETER];


// rs contains the result set of cursor my_cur
sql.call(sqlString, parametersList) { ResultSet rs ->
  while (rs.next()) {
      println rs.getString("my_column")
  }
};

P.S. Dan terima kasih atas pertanyaannya.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Spring Boot Actuator/titik akhir kesehatan tidak menampilkan informasi database atau sistem file

  2. kursor di pemicu

  3. Pemantauan SQL di Pengembang SQL

  4. GROUP BY tanpa fungsi agregat

  5. Masalah dengan pengurangan tanggal di Oracle