Oracle
 sql >> база данни >  >> RDS >> Oracle

Groovy Oracle Stored Proc - неваден индекс на колона

Следният код може да ви помогне да получите променлива на SYS_REFCURSOR от анонимен блок на Oracle.

Трябва да се съсредоточим върху няколко ключови подробности:

  1. Клас groovy.sql.Sql няма съответен OutParameter и го правим ръчно като CURSOR_PARAMETER и го предайте на sql.call метод
  2. Вземете предвид, че блокът започва с {call DECLARE и завършва с END } без точка и запетая след END. В противен случай можем да получим лошо разпознаваемо SQLException в лицето.
  3. Въпросителните знаци ? вътре в sqlString са места за свързване на параметри. Свързванията се правят в естествен ред, като се вземат стойности от parametersList .
    • В този пример имаме единственото обвързване, така че ? се свързва с CURSOR_PARAMETER, третирайки стойността като OUT параметър от предаден тип;
  4. Има само едно влизане в затварянето след sql.call и ResultSet rs осигурете редове на курсора my_cur деклариран в анонимен блок.
  5. Можем да опростим sqlString чрез използване на функция, връщаща SYS_REFCURSOR вместо процедура с OUT параметър. Така че може да изглежда така "{call BEGIN ? := MY_FUNC(); END}" или дори "{? = 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. И благодаря за въпроса.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Разлика между SELECT DISTINCT и SELECT UNIQUE

  2. Концепция:Създайте Java програма и я заредете в Oracle DB - функцията Wrapper извиква java функция с връщане

  3. Как да потвърдите номера на кредитна карта и да идентифицирате нейния тип с помощта на PL/SQL?

  4. Инсталиране на Oracle Instant Client

  5. Вмъкнете CLOB в базата данни на Oracle