Bonjour à tous,

Je rencontre un problème et aimerais avoir une justification car je ne comprends pas trop.

Je désire appeler une procédure via JdbcTemplate comportant en paramètre Input un TYPE.
J'ai donc créé mon type Article ainsi qu'un autre type comportant une table d'articles :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
CREATE OR REPLACE TYPE article AS object (
  REFERENCE VARCHAR2(14),
  FOURNISSEUR VARCHAR2(14),
  CONTRAT VARCHAR2(14)
);
 
CREATE OR REPLACE TYPE ListArticles as TABLE OF article;
J'ai ensuite créé une procédure avec en Input la liste des articles. Dans cette procédure, j'effectue une simple insertion (Pour test) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
CREATE OR REPLACE PACKAGE ArticleListUpload is
  PROCEDURE testList(p_listArticles  IN ListArticles );
END;
 
CREATE OR REPLACE PACKAGE BODY ArticleListUpload IS
PROCEDURE testList(p_listArticles  IN ListArticles ) IS
  BEGIN
    INSERT INTO TEST_ARTICLE (REFERENCE, FOURNISSEUR, CONTRAT) VALUES ('ref', 'firm', 'contrat');
  END;
END PriceListUpload;
Coté java, j'essaie simplement d'appeler cette procédure :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
final String procedureCall = "{call ArticleListUpload.testList(?)}";
Connection connection = null;
        try {
            connection = jdbcTemplate.getDataSource().getConnection(); //jdbcTemplate instancié en amont par injection spring (Utilisation d'un properties avec la conf BD)
            CallableStatement callableSt = connection.prepareCall(procedureCall);
            Struct itemObject = connection.createStruct("LISTARTICLES",null); // Null pour test, je passerai la structure par la suite
            callableSt.setObject(1,itemObject);
            callableSt.executeUpdate();
        }
        catch (SQLException e){
            LOG.debug("ERROR -- : "+e.toString());
        }
        finally {
            if (connection != null)
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
        }
Lors de l'appel de connection.createStruct, j'obtiens l'erreur suivant :
ERROR -- : java.sql.SQLException: Fail to construct descriptor: Invalid arguments

Par contre cela marche bien lorsque je mets en INPUT de la procédure un objet :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
CREATE OR REPLACE PACKAGE ArticleListUpload is
  PROCEDURE testList(p_Article  IN Article );
END;
 
CREATE OR REPLACE PACKAGE BODY ArticleListUpload IS
PROCEDURE testList(p_Article  IN Article ) IS
  BEGIN
    INSERT INTO TEST_ARTICLE (REFERENCE, FOURNISSEUR, CONTRAT) VALUES ('ref', 'firm', 'contrat');
  END;
END PriceListUpload;
Avec le code java suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Connection connection = null;
        try {
            connection = jdbcTemplate.getDataSource().getConnection();
            CallableStatement callableSt = connection.prepareCall(procedureCall);
            Struct itemObject = connection.createStruct("ARTICLE",null);
            callableSt.setObject(1,itemObject);
            callableSt.executeUpdate();
        }
        catch (SQLException e){
            LOG.debug("ERROR -- : "+e.toString());
        }
        finally {
            if (connection != null)
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
        }
Pouvez-vous m'éclairez sur ce problème s'il vous plait ?

Merci par avance.