J'exécute la requête suivante à partir de Microsoft SQL Server Studio, qui fonctionne correctement et affiche les résultats:
SELECT *
INTO #temp_table
FROM md_criteria_join
WHERE user_name = 'tecgaw'
UPDATE #temp_table
SET user_name = 'tec'
WHERE user_name != 'tec'
SELECT *
FROM md_criteria_join
WHERE user_name = 'tec'
AND view_name NOT IN (SELECT view_name
FROM md_criteria_join
WHERE user_name = 'tecgaw')
UNION
SELECT *
FROM #temp_table
ORDER BY view_name,
user_name,
crit_usage_seq,
crit_join_seq
Cependant, si j'exécute la même requête en Java, une exception est levée et indique "L'instruction n'a pas renvoyé de jeu de résultats". Voici le code Java:
statement = conn.getConnection().createStatement();
resultSet = stmt.executeQuery(sql.toString());
Est-ce parce que je ne peux pas faire plusieurs requêtes SQL dans une seule instruction (c'est-à-dire, créer le #temp_table
, le mettre à jour, puis utiliser pour cela l'instruction choisie)?
J'ai trouvé une question similaire dans StackOverflow ici . Vous devez activer la connexion pour prendre en charge plusieurs instructions et les séparer à l'aide de ;
. Pour des exemples concrets, voir cette réponse. Cependant, ce n'est que pour MySql.
Aussi, je pense que vous pouvez réécrire votre SQL en une seule requête
SELECT columnA, columnB, 'tec' as user_name from md_criteria_join
WHERE (
user_name = 'tec'
AND view_name NOT IN (
SELECT view_name
FROM md_criteria_join
WHERE user_name = 'tecgaw')
)
OR user_name = 'tecgaw'
ORDER BY view_name, user_name, crit_usage_seq, crit_join_seq
Une autre option consiste à déplacer vos instructions dans une procédure stockée et à les activer à partir de JDBC à l'aide de CallableStatement.
Ou peut-être devriez-vous essayer de l'exécuter avec plusieurs instructions jdbc comme celle-ci
Connection conn = conn.getConnection(); //just to make sure its on single connection
conn.createStatement("SELECT INTO #temp_table").executeUpdate();
conn.createStatement("UPDATE #temp_table").executeUpdate();
conn.createStatement("SELECT ...").executeQuery();
Notez que vous devez fermer des ressources et peut-être pour de meilleures performances, vous pourriez utiliser les méthodes addBatch et executeBatch
JDBC devient confus par le nombre de lignes.
Vous devez utiliser SET NOCOUNT ON
.
Utilisez l'instruction execute
pour manipulation de données like insérer, mettre à jour et supprimer et executeQuery
pour récupération de données like select
Je vous suggère de séparer votre programme en deux déclarations, une execute
et une executeQuery
.
Si vous ne le souhaitez pas, essayez de séparer les instructions par un point-virgule. Mais je ne suis pas sûr de cette action si cela vous donne un résultat ou non.
dans ms sql, vous devez également définir nocount à droite au début de la procédure stockée et mettre fin à l'instruction de sélection/mise à jour/insertion de bloc avec ";"