sql >> Database teknologi >  >> RDS >> Oracle

Groovy Oracle Stored Proc - ugyldigt kolonneindeks

Følgende kode kan hjælpe dig med at få variablen SYS_REFCURSOR fra Oracle anonym blok.

Vi bør fokusere på nogle få nøgledetaljer:

  1. Klasse groovy.sql.Sql har ikke tilsvarende OutParameter og vi laver det manuelt som CURSOR_PARAMETER og send det til sql.call metode
  2. Tænk på, at blokken starter med {call DECLARE og slutter med END } uden semikolon efter SLUT. Ellers kan vi få en dårligt genkendelig SQLException i ansigtet.
  3. Spørgsmålstegnet ? inde i sqlString er steder for parameterbindinger. Bindinger er lavet i den naturlige rækkefølge med værdier fra parametersList .
    • I dette eksempel har vi den eneste binding, så ? binder med CURSOR_PARAMETER og behandler værdien som OUT parameter af bestået type;
  4. Der er kun én indtastning af lukning efter sql.call og ResultSet rs angiv rækker med markør my_cur erklæret i anonym blok.
  5. Vi kan forenkle sqlString ved at bruge en funktion, der returnerer SYS_REFCURSOR i stedet for en procedure med OUT parameter. Så det kunne se sådan ud "{call BEGIN ? := MY_FUNC(); END}" eller endda "{? = 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. Og tak for spørgsmålet.




  1. 5 must-know-fordele ved Microsoft Access

  2. Hvordan deserialiseres BigDecimal-værdi modtaget fra kafka-mægler gennem debezium CDC-mekanisme?

  3. COALESCE() Funktion i Oracle

  4. Postgres-databasen, der kører i docker, bliver ved med at hænge