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

Groovy SQL Oracle Array Funkcja/procedura rejestracja parametrów wyjściowych

Właśnie spotkałem się z tym samym problemem i teraz mam rozwiązanie. Zasadniczo są dwa problemy. Po pierwsze, Oracle wymaga podania nazwy typu tablicy, gdy parametr wyjściowy jest rejestrowany. Drugi to sposób na przekonanie Groovy'ego, aby pozwolił ci to zrobić. Na szczęście wygląda na to, że projektanci Groovy pomyśleli o tym i pozwalają na podklasę groovy.sql.Sql, aby podłączyć się do ustawień parametrów.

Użyję przykładowego typu i procedury składowanej w tej odpowiedzi na podobne pytanie na poziomie JDBC:

SQL> CREATE TYPE t_type AS OBJECT (val VARCHAR(4));
2  /
Type created

SQL> CREATE TYPE t_table AS TABLE OF t_type;
2  /
Type created

SQL> CREATE OR REPLACE PROCEDURE p_sql_type (p_out OUT t_table) IS
2  BEGIN
3     p_out := t_table(t_type('a'), t_type('b'));
4  END;
5  /
Procedure created

Teraz potrzebujemy kilku nowych klas Groovy:

import groovy.sql.*
import java.sql.CallableStatement
import java.sql.PreparedStatement
import java.sql.SQLException
import oracle.jdbc.driver.*

class OracleArrayOutParameter implements OutParameter {
    String typeName

    int getType() {
        OracleTypes.ARRAY
    }
}

class OracleArrayAwareSql extends Sql {

    OracleArrayAwareSql(Sql parent) {
        super(parent)
    }

    void setObject(PreparedStatement statement, int i, Object value) throws SQLException {
        if (value instanceof OracleArrayOutParameter) {
            try {
                OracleArrayOutParameter out = (OracleArrayOutParameter) value;
                ((CallableStatement) statement).registerOutParameter(i, out.getType(), out.typeName);
            } catch (ClassCastException e) {
                throw new SQLException("Cannot register out parameter.");
            }
        }
        else {
            super.setObject(statement, i, value)
        }
    }
}

Ich użycie jest dość proste. Prawdopodobnie będziesz potrzebować dokumentacji Oracle dotyczącej tablic, aby zrozumieć wynikowe struktury danych.

// First create a "normal" groovysqlSql instance, using whatever method you like

def parent = Sql.newInstance("jdbc:oracle:thin:@host:port:sid", "user", "password", "oracle.jdbc.OracleDriver")

// Then create an OracleArrayAwareSql instance giving that parent instance as a parameter

def sql = new OracleArrayAwareSql(parent)

// Now define an OracleArrayOutParameter naming the array type

def tTableParam = new OracleArrayOutParameter(typeName: 'T_TABLE')

// And make a stored procedure call as usual

sql.call("{call p_sql_type(${tTableParam})}") { out ->

    // The returned parameter is of type oracle.sql.ARRAY

    out.array.each { struct ->
        println struct.attributes
    }
}



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ile indeksów bazy danych to za dużo?

  2. Jak znaleźć zależności w pakiecie Oracle?

  3. Używanie funkcji Max() do wybierania wartości grup

  4. Jak formatować liczby w Oracle

  5. Błąd:PLS-00428:w tej instrukcji oczekiwana jest klauzula into