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

Groovy SQL Oracle Array Fungsi/Prosedur Keluar Registrasi Parameter

Saya baru saja menghadapi masalah yang sama dan sekarang memiliki solusi. Pada dasarnya ada dua masalah. Yang pertama adalah Oracle mengharuskan Anda untuk memberi tahu nama tipe array ketika parameter output didaftarkan. Yang kedua adalah bagaimana membujuk Groovy untuk membiarkan Anda melakukan itu. Untungnya, tampaknya para desainer Groovy memikirkan hal ini dan mengizinkan Anda untuk membuat sub-kelas groovy.sql.Sql untuk menghubungkan ke pengaturan parameter.

Saya akan menggunakan jenis contoh dan prosedur tersimpan dalam jawaban ini untuk pertanyaan serupa di tingkat 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

Sekarang kita membutuhkan beberapa kelas Groovy baru:

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)
        }
    }
}

Penggunaan ini cukup mudah. Anda mungkin ingin dokumentasi Oracle pada array untuk memahami struktur data yang dihasilkan.

// 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. Bisakah terjadi deadlock dengan metode akses yang sama?

  2. 40 pertanyaan yang harus Anda ketahui tentang R12.2

  3. Koleksi Oracle PL/SQL - Menambahkan Elemen ke Tabel yang Ada

  4. 9 kueri Printer Oracle Apps Berguna Teratas

  5. Hasil format pengurangan waktu