2014-06-13 3 views
0

Cette question est similaire à: Mysql - Stored procedure OUT variable return null, malheureusement leurs solutions n'ont pas fonctionné pour moi.Procédure stockée Retour Null

J'ai une base de données remplie avec des données sur qui a utilisé mon programme et quand, et j'essaye de créer une procédure stockée dans MySQL pour récupérer toutes les données et l'envoyer à ma servlet java, où elle sera traitée.

C'est ce que j'ai actuellement ma procédure stockée:

CREATE DEFINER=`root`@`localhost` 

PROCEDURE `getTableData`(OUT time VARCHAR(45), OUT fName VARCHAR(45), 
         OUT lName VARCHAR(45), OUT rVar INT) 

BEGIN 
    SELECT rqTime, name, lastName, requestVar FROM pdata.userlist; 

END 

Voici comment j'appelle la requête en Java:

CallableStatement stmt = null; 
ResultSet rs = null;   
String sqlQuery = "{call getTableData (?, ?, ?, ?)}";  
stmt = conn.prepareCall(sqlQuery); 

    stmt.registerOutParameter(1, java.sql.Types.VARCHAR); 
    stmt.registerOutParameter(2, java.sql.Types.VARCHAR); 
    stmt.registerOutParameter(3, java.sql.Types.VARCHAR); 
    stmt.registerOutParameter(4, java.sql.Types.INTEGER); 

stmt.execute(); 

Lorsque je tente d'appeler cette procédure stockée en Java (J'ai essayé d'utiliser des ensembles de résultats et la normale getString(), etc) toutes les valeurs renvoient null.

Ma conception de table est le long des lignes de:

Request Time (millis), name, lastName, requestID 

1402341252155, John, Doe, 11 

Toute aide serait grandement appréciée. Je me sens comme si le problème réside dans la procédure stockée elle-même, en particulier la façon dont je sélectionne les variables de la table et les assigner aux paramètres "out".

Merci!

+1

Avez-vous essayé de faire prepareQuery plutôt que prepareCall et simplement l'exécuter en tant que requête puis en traitant le ResultSet qui est revenu? Je fais ça tout le temps et ça marche bien. –

+0

@Tim vous devez utiliser 'prepareCall' pour exécuter les procédures stockées. –

+0

Puisqu'ils sont hors paramètres, vous devriez utiliser 'stmt.getXxx (index)' pour récupérer les données, n'utilisez pas 'ResultSet'. –

Répondre

0

Le problème est que vous ne définissez jamais les valeurs de vos paramètres out dans votre procédure. Fixez votre requête:

SELECT 
    rqTime, name, lastName, requestVar 
INTO 
    time, fName, lName, rVar 
FROM pdata.userlist; 
-- Probably you need a WHERE or another statement to make sure you only retrieve 1 row as result 
-- Otherwise, this stored procedure will fail 

En outre, dans le côté Java, vous devez enregistrer les paramètres out et récupérer les résultats directement à partir CallableStatement, ne les récupère pas d'un ResultSet.

+0

Merci, cela fonctionne! Y a-t-il un moyen pour moi d'obtenir la table entière, étant donné que j'ai besoin d'une déclaration where. Aussi, y a-t-il un moyen pour moi de les récupérer à partir d'un ResultSet? – jFram

+0

Si vous le pouvez, utilisez un 'PreparedStatement' et exécutez directement votre instruction SELECT. Si vous devez utiliser une procédure stockée, exécutez l'instruction SELECT directement dans votre procédure et récupérez le ResultSet de CallableStatement. –

+0

J'ai inséré "rs = stmt.getResultSet();" après l'instruction execute, mais il me donne une exception SQL, en disant que le résultat se composait de plus d'une ligne. (En outre, je dois utiliser une procédure stockée à des fins de sécurité). – jFram

Questions connexes