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 :
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 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;
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 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;
Lors de l'appel de connection.createStruct, j'obtiens l'erreur 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
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(); } }
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 :
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 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;
Pouvez-vous m'éclairez sur ce problème s'il vous plait ?
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(); } }
Merci par avance.
Partager