Récupérer le type de table Oracle à partir de la procédure stockée à l'aide de JDBC

J'essaie de comprendre les différentes manières d'obtenir les données de la table à partir de procédures stockées Oracle /fonctions à l'aide de JDBC. Les six façons de faire sont les suivantes:

  1. procédure de retour d'un niveau schéma type de table comme un paramètre de SORTIE
  2. procédure de renvoi d'un paquet de niveau de type de table comme un paramètre de SORTIE
  3. procédure de renvoi d'un paquet de niveau de type de curseur comme un paramètre de SORTIE
  4. fonction retournant un niveau schéma type de table
  5. la fonction de renvoi d'un paquet de niveau de type de table
  6. la fonction de renvoi d'un paquet de niveau de type de curseur

Voici quelques exemples en PL/SQL:

-- schema-level table type
CREATE TYPE t_type AS OBJECT (val VARCHAR(4));
CREATE TYPE t_table AS TABLE OF t_type;

CREATE OR REPLACE PACKAGE t_package AS
  -- package level table type
  TYPE t_table IS TABLE OF some_table%rowtype;
  -- package level cursor type
  TYPE t_cursor IS REF CURSOR;
END library_types;

-- and example procedures:
CREATE PROCEDURE p_1 (result OUT t_table);
CREATE PROCEDURE p_2 (result OUT t_package.t_table);
CREATE PROCEDURE p_3 (result OUT t_package.t_cursor);
CREATE FUNCTION f_4 RETURN t_table;
CREATE FUNCTION f_5 RETURN t_package.t_table;
CREATE FUNCTION f_6 RETURN t_package.t_cursor;

J'ai réussi à appeler 3, 4, et 6 avec JDBC:

//Not OK: p_1 and p_2
CallableStatement call = connection.prepareCall("{ call p_1(?) }");
call.registerOutParameter(1, OracleTypes.CURSOR);
call.execute(); //Raises PLS-00306. Obviously CURSOR is the wrong type

//OK: p_3
CallableStatement call = connection.prepareCall("{ call p_3(?) }");
call.registerOutParameter(1, OracleTypes.CURSOR);
call.execute();
ResultSet rs = (ResultSet) call.getObject(1); //Cursor results

//OK: f_4
PreparedStatement stmt = connection.prepareStatement("select * from table(f_4)");
ResultSet rs = stmt.executeQuery();

//Not OK: f_5
PreparedStatement stmt = connection.prepareStatement("select * from table(f_5)");
stmt.executeQuery(); //Raises ORA-00902: Invalid data type

//OK: f_6
CallableStatement call = connection.prepareCall("{ ? = call f_6 }");
call.registerOutParameter(1, OracleTypes.CURSOR);
call.execute();
ResultSet rs = (ResultSet) call.getObject(1); //Cursor results

Alors, évidemment, je vais avoir du mal à comprendre

  1. Comment faire pour récupérer le schéma de niveau et de niveau package types de table de paramètres dans des procédures stockées
  2. Comment faire pour récupérer des colis-niveau de la table des types de fonctions stockées

Je n'arrive pas à trouver toute la documentation sur cette question, comme tout le monde utilise toujours les curseurs au lieu de les types de table. Peut-être parce qu'il n'est pas possible? Je préfère les types de table, bien que, parce qu'ils sont officiellement définies et peuvent être découverts à l'aide du dictionnaire de vues (au moins le niveau schéma des types de table).

Remarque: évidemment, je pourrais écrire une fonction wrapper de revenir les paramètres de SORTIE et le paquet au niveau des types de table. Mais je préfère la solution propre.

source d'informationauteur Lukas Eder