Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Groovy Oracle Stored Proc — nieprawidłowy indeks kolumny

Poniższy kod może pomóc w uzyskaniu zmiennej SYS_REFCURSOR z anonimowego bloku Oracle.

Powinniśmy skupić się na kilku kluczowych szczegółach:

  1. Klasa groovy.sql.Sql nie ma odpowiedniego OutParameter i robimy to ręcznie jako CURSOR_PARAMETER i przekaż go do sql.call metoda
  2. Uważ, że blok zaczyna się od {call DECLARE i kończy się na END } bez średnika po KONIEC. W przeciwnym razie możemy uzyskać słabo rozpoznawalny SQLException w twarz.
  3. Znaki zapytania ? wewnątrz sqlString to miejsca na powiązania parametrów. Wiązania są tworzone w naturalnej kolejności, przyjmując wartości z parametersList .
    • W tym przykładzie mamy jedyne powiązanie, więc ? wiąże się z CURSOR_PARAMETER traktując wartość jako OUT parametr przekazanego typu;
  4. Jest tylko jeden wpis do zamknięcia po sql.call i ResultSet rs podaj wiersze kursora my_cur zadeklarowane w bloku anonimowym.
  5. Możemy uprościć sqlString za pomocą funkcji zwracającej SYS_REFCURSOR zamiast procedury z OUT parametr. Może więc wyglądać tak "{call BEGIN ? := MY_FUNC(); END}" lub nawet "{? = 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")
  }
};

PS I dziękuję za pytanie.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przyznawanie uprawnień do tworzenia katalogów w Oracle

  2. Użycie select w ELSE instrukcji CASE daje mi ORA-00937:nie jest to funkcja grupy pojedynczej

  3. Szacowanie czasu utworzenia indeksu w Oracle

  4. Jak zdobyć pierwszy element przez XPath w Oracle

  5. Zestawy z jednej tabeli, pogrupowane według kolumny