IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

Procédure stockée et resultSet


Sujet :

JDBC Java

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 314
    Points : 206
    Points
    206
    Par défaut Procédure stockée et resultSet
    Bonjour,

    Je dispose d'une procédure stockée sous msSQl qui nécessite 2 paramètres afin d'être exécutée. Cette procédure stockée me retourne des plusieurs de résultats avec plusieurs colonnes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     exec myStoredProcedure @parm1='D', @myDate='2002-06-21'
    Je souhaiterais exécuté celle-ci dans un script java à l'aide du connecteur jdbc.

    Voici mon code
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
     public void executeSprocInParams() {
    	   try {
    	      CallableStatement pstmt = conn.prepareCall("{call dbo.unvRepConstituentsAddition(?,?)}");
     
     
    	      java.util.Calendar cal = Calendar.getInstance();
    	      java.util.Date utilDate = new java.util.Date(); // your util date
    	      cal.setTime(utilDate);
    	      cal.set(Calendar.HOUR_OF_DAY, 0);
    	      cal.set(Calendar.MINUTE, 0);
    	      cal.set(Calendar.SECOND, 0);
    	      cal.set(Calendar.MILLISECOND, 0); 
    	      cal.set(Calendar.DAY_OF_MONTH, 21);
    	      cal.set(Calendar.MONTH, 06);
    	      cal.set(Calendar.YEAR, 2002);
    	      java.sql.Date sqlDate = new java.sql.Date(cal.getTime().getTime()); 
     
    	      pstmt.setString("eco", "D");
    	      pstmt.setDate("reviewDate", sqlDate);
     
    	      ResultSet rs = pstmt.executeQuery();
     
     
     
     
    	      while (rs.next()) {
    	         System.out.println("company:");
    	         System.out.println(rs.getString("company"));
    	         System.out.println();
    	      }
    	      rs.close();
    	      pstmt.close();
    	   }
     
    	   catch (Exception e) {
    	      e.printStackTrace();
    	    }
    	}
    Lorsque j'exécute ma méthode j'obtiens le message d'erreur suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    com.microsoft.sqlserver.jdbc.SQLServerException: The statement did not return a result set.
    	at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:190)
    	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:408)
    	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:350)
    	at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5696)
    	at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1715)
    	at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:180)
    	at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:155)
    	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:285)
    	at universeReview.ConnectMSSQLServer.executeSprocInParams(ConnectMSSQLServer.java:156)
    	at universeReview.ConnectMSSQLServer.main(ConnectMSSQLServer.java:182)
    Je devrais pourtant recevoir en résultat un resulSet.

    Sauriez-vous quelle est mon erreur ?

    Par avance merci.
    Nulla dies sin linea

  2. #2
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     pstmt.setString(1, "D");
    	      pstmt.setDate(2, sqlDate);
    A+.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 314
    Points : 206
    Points
    206
    Par défaut
    Citation Envoyé par andry.aime Voir le message
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     pstmt.setString(1, "D");
    	      pstmt.setDate(2, sqlDate);
    A+.
    Merci pour ta réactivité.

    Suite aux modifications suggérées, j'obtiens désormais le message d'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
     
     
    com.microsoft.sqlserver.jdbc.SQLServerException: Error converting data type nvarchar to date.
    	at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216)
    	at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1515)
    	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:404)
    	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:350)
    	at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5696)
    	at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1715)
    	at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:180)
    	at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:155)
    	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:285)
    	at universeReview.ConnectMSSQLServer.executeSprocInParams(ConnectMSSQLServer.java:156)
    	at universeReview.ConnectMSSQLServer.main(ConnectMSSQLServer.java:184)
    Ma date est pourtant bien du type java.sql.Date.

    Une idée ?

    Par avance Merci.
    Nulla dies sin linea

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 314
    Points : 206
    Points
    206
    Par défaut
    Je pense avoir trouvé mon erreur. Le paramètre 1 était la date et le 2 était la chaîne de caractère.
    La procédure stockée s'exécute bien. Sous SQL Management studio. La procédure stockée m'affiche en résultat un select. J'aurais aimé affiché ce résultat sous java.
    Mais lorsque j'utilise la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ResultSet rs =  pstmt.executeQuery();
    J'obtiens toujours le message d'erreur suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    com.microsoft.sqlserver.jdbc.SQLServerException: The statement did not return a result set.
    	at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:190)
    	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:408)
    	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:350)
    	at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5696)
    	at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1715)
    	at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:180)
    	at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:155)
    	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:285)
    	at universeReview.ConnectMSSQLServer.executeSprocInParams(ConnectMSSQLServer.java:156)
    	at universeReview.ConnectMSSQLServer.main(ConnectMSSQLServer.java:182)
    Quelqu'un aurait une idée sur mon erreur ?

    Par avance merci.
    Nulla dies sin linea

  5. #5
    Membre régulier
    Profil pro
    dev
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Points : 78
    Points
    78
    Par défaut
    Bonjour,

    je pense que le problème est dans la proc stock.
    essaye d'ajouter

    au début de la proc comme dans ce lien

  6. #6
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Cette ligne ne sert à rien aussi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ava.util.Date utilDate = new java.util.Date(); // your util date
    A+.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 314
    Points : 206
    Points
    206
    Par défaut
    Citation Envoyé par chortani Voir le message
    Bonjour,

    je pense que le problème est dans la proc stock.
    essaye d'ajouter

    au début de la proc comme dans ce lien

    Merci pour ta réponse. Le SET du NOCOUNT à ON ne change rien.

    Voici le code de ma procédure stockée

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    USE [Universe]
    GO
    /****** Object:  StoredProcedure [dbo].[unvRepConstituentsAddition]    Script Date: 24/09/2013 17:18:25 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
     
     
    ALTER PROCEDURE [dbo].[unvRepConstituentsAddition] @reviewDate date, @eco char(1) = null
    AS BEGIN
    	-- srcFileName: unvUtil.sql
    	--
    	-- purpose: get the list of constituents added
    	--
     
    	create table #eco ( eco char(1) null )
    	if ( @eco is null )
    	begin
    		insert #eco (eco) values ('D')
    		insert #eco (eco) values ('E')
    	end
    	else
    	begin
    		insert #eco (eco) select @eco
    	end
     
    	select	* 
    	into	#current
    	from	mrkCompoMaster	cm
    	join	#eco			e on (e.eco = SUBSTRING(cm.blockCode,2,1))
    	where	cm.universeDate=@reviewdate
     
    	delete	#current
    	from	#current c
    	join	unvCompoOut co on co.pricingDate=c.pricingdate and co.tradingItemId=c.tradingItemId
     
    	declare	@prevuniversedate date
    	select	@prevuniversedate=MAX(universedate)
    	from	unvFrame f
    	where	f.universeDate < @reviewdate
     
    	select	* 
    	into	#previous
    	from	mrkCompoMaster	cm
    	join	#eco			e on (e.eco = SUBSTRING(cm.blockCode,2,1))
    	where	universeDate=@prevuniversedate
     
    	delete	#previous
    	from	#previous p
    	join	unvCompoOut co on co.pricingDate=p.pricingdate and co.tradingItemId=p.tradingItemId
     
    	delete	#current
    	from	#current	c
    	 join	#previous	p on c.scibetaId=p.sciBetaId 
     
    	select 	c.universeDate, c.blockCode, SecId=sciBetaId, Company=companyName, Country=c.companyCountry, MIC, Ccy=cur.ISOCode, Action='Add', EffectiveDate=convert(date, dateadd(day,3,c.universeDate)), Comment='', Security=sec.securityName, isin, sedol
    	from 	
    			#current 	c
    	 left outer join	CIQ.dbo.ciqSecurity sec on sec.securityId=c.securityId
    	 join	CIQ.dbo.ciqCurrency cur on cur.currencyId=c.currencyId
    	order by effectiveDate desc, companyName asc
     
    	drop table #current, #previous, #eco
     
    END ;
    C'est le résultat du dernier select que j'essaie de récupérer.

    Par avance merci.
    Nulla dies sin linea

  8. #8
    Membre régulier
    Profil pro
    dev
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Points : 78
    Points
    78
    Par défaut
    d'après ce lien, il faut utiliser execute() et pas executeQuery().

    voir aussi ce lien

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 314
    Points : 206
    Points
    206
    Par défaut
    Citation Envoyé par chortani Voir le message
    d'après ce lien, il faut utiliser execute() et pas executeQuery().

    voir aussi ce lien


    Meric mais à la fin de ma procédure stockée, je fait un select qui me retourne des lignes. Ce sont ces lignes que je souhaite récupérer sous java. La fonction execute me retourne un boolean. Alors que j'attends en sortie un resultSet.
    Nulla dies sin linea

  10. #10
    Membre régulier
    Profil pro
    dev
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Points : 78
    Points
    78
    Par défaut
    la réponse est dans le deuxième lien . il faut utiliser getMoreResults() pour récupérer les résultat.

  11. #11
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    Avec une procédure stockée dans MSSQL qui doit me renvoyer 2 résultats, je fais comme ça (je mets de côté le passage de paramètres) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    String sql = 
    "SET NOCOUNT ON 
    EXEC myStoredProcedure @parm1='D', @myDate='2002-06-21'";
    Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
    stmt.execute(sql);
    ResultSet rs1 = stmt.getResultSet();
    // faire éventuellement qqch avec rs1
    stmt.getMoreResults(Statement.CLOSE_CURRENT_RESULT);
    ResultSet rs2 = requete.getResultSet();
    A noter que le SET NOCOUNT ON précède l'exécution de la PS (sinon c'est trop tard)
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 314
    Points : 206
    Points
    206
    Par défaut
    Citation Envoyé par Népomucène Voir le message
    Avec une procédure stockée dans MSSQL qui doit me renvoyer 2 résultats, je fais comme ça (je mets de côté le passage de paramètres) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    String sql = 
    "SET NOCOUNT ON 
    EXEC myStoredProcedure @parm1='D', @myDate='2002-06-21'";
    Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
    stmt.execute(sql);
    ResultSet rs1 = stmt.getResultSet();
    // faire éventuellement qqch avec rs1
    stmt.getMoreResults(Statement.CLOSE_CURRENT_RESULT);
    ResultSet rs2 = requete.getResultSet();
    A noter que le SET NOCOUNT ON précède l'exécution de la PS (sinon c'est trop tard)
    Ceci résout cela.
    Encore une fois merci à tous pour le coup de main.
    Nulla dies sin linea

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 16h48
  2. [PDO] Procédures stockées, paramètres OUT et multiples resultset
    Par Gusso dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 27/05/2010, 08h35
  3. [Pervasive SQL ] procédure stockée
    Par magellan dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 25/10/2002, 13h17
  4. Explication procédure stockée
    Par underworld dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/09/2002, 10h51
  5. [Comparatif] Procédures stockées, triggers, etc.
    Par MCZz dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 28/08/2002, 12h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo