Je travaille avec une instruction Java préparée qui extrait des données d'une base de données Oracle. En raison de certains problèmes de performances, la requête utilise une "colonne virtuelle" comme index.Instruction préparée - utilisation d'une fonction dans le cadre de la clause where
La requête ressemble à ceci:
String status = "processed";
String customerId = 123;
String query = "SELECT DISTINCT trans_id FROM trans WHERE status = " + status + " AND FN_GET_CUST_ID(trans.trans_id) = " + customerId;
Connection conn = getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = conn.prepareStatement(query);
ps.execute();
...
} catch (...)
Cela ne fonctionne pas. Avoir la fonction dans le cadre de la clause where provoque une exception SQLException. Je connais CallableStatement et je sais que je pourrais l'utiliser d'abord, puis concaténer les résultats. Cependant, cette table utilise FN_GET_CUST_ID (trans_id) comme partie de son index. Existe-t-il un moyen d'utiliser une instruction préparée avec une fonction de base de données en tant que paramètre de requête?
Le statut traité doit être indiqué. Peut-être que c'est ce qui provoque votre exception, non? – quosoo
Avoir une fonction dans la clause WHERE devrait fonctionner, votre problème se situe probablement ailleurs. Pourriez-vous publier le code d'erreur et le message (SQLException.getErrorCode)? La requête fonctionne-t-elle réellement dans SQL * Plus? –
Désolé, l'exemple que j'ai posté n'a pas été copié textuellement. J'ai essayé de le réduire pour enlever beaucoup de choses excédentaires non essentielles. Les citations manquantes ne sont pas le problème. – emulcahy