2017-09-04 1 views
0

Mon application iOS doit communiquer avec la base de données du serveur. Je choisis le développeur SQL Oracle 11g/Oracle pour l'implémentation de la base de données du serveur. Je me suis récemment familiarisé avec les requêtes JDBC, JAVA et SQL. D'où ma question peut sembler boiteuse. Voici ma situation:Comment déplacer le curseur sur les lignes d'une seule table parmi plusieurs tables de la base de données Oracle?

Ma base de données contient deux tables (T1 et T2). Je peux envoyer des données au serveur et les stocker dans la base de données via mon application iOS. Maintenant, j'ai besoin de récupérer les données du serveur selon la demande de l'application. A cet effet, j'utilise un ResultSet variable:

private ResultSet rs = SQLProcess("SELECT * FROM T1, T2"); 

Ici, SQLprocess est une méthode public executeQuery avec le type de retour ResultSet et arguments que les colonnes des deux tables .La requête SQL pour la executeQuery est la suivante:

"SELECT a.ID '"+msg1+"', a.X '"+msg2+"', a.Y '"+msg3+"', a.Xe '"+msg4+"', a.Ye '"+msg5+"', a.SDe '"+msg6+"', a.Xs '"+msg7+"', a.Ys '"+msg8+"', a.SDs '"+msg9+"', a.Xw '"+msg10+"', a.Yw '"+msg11+"', a.SDw '"+msg12+"', a.Xn '"+msg13+"', a.Yn '"+msg14+"', a.SDn '"+msg15+"', b.ID '"+msg16+"', b.Zn '"+msg17+"' FROM T1 a , T2 b WHERE a.ID = b.ID"); 

ici, msg1 à msg17 sont les arguments de la méthode S QLProcess (qui sont les colonnes des deux tables. msg1 à msg15 représentent les colonnes de T1 et msg16 et msg17 représentent les colonnes de T2).

La méthode qui est responsable d'envoyer des données à l'(application iOS) client est donné comme suit:

void sendTo(InetAddress add) { 
    try{ 
     DataOutputStream out = (DataOutputStream) clients.get(add); 

     while(rs.next()){ 
      String msg = '\n' +rs.getString(1) + "," + rs.getString(2)+ "," + rs.getString(3)+ "," + rs.getString(4)+ "," + rs.getString(5)+ "," + rs.getString(6)+ "," + rs.getString(7)+ "," + rs.getString(8) +"," + rs.getString(9)+ "," + rs.getString(10)+ "," + rs.getString(11)+ "," + rs.getString(12)+ "," + rs.getString(13)+ "," + rs.getString(14)+ "," + rs.getString(15)+ "," + rs.getString(16)+ "," + rs.getString(17)+'\n'; 
      System.out.println(msg); 
      out.writeUTF(msg); 
     } 
    }catch(IOException e){ 
     e.printStackTrace(); 
    }catch (SQLException e) { 

     e.printStackTrace(); 
    } 

} 

Avec cette méthode, les données sont envoyées à l'application iOS mais avec moyens mixtes. Autrement dit, s'il y a deux lignes dans chaque table:

T1:

Row1: 1,2,3,4,5,6,7,8,9,10,11,12,13,14, 15

Row2: 2,2,3,4,5,6,7,8,9,10,11,12,13,14,15

T2:

Row1: 1, 16

Ligne2: 2,17

Ensuite, les données reçues à l'application iOS est:

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,1,16

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,2,17

2,2,3,4,5,6 , 7,8,9,10,11,12,13,14,15,1,16

2,2,3,4,5,6,7,8,9,10,11,12, 13,14,15,2,17

Ce que j'ai besoin est:

1,2,3,4,5,6,7,8,9,10,11,12,13,14, 15,1 16 et 2,2,3,4,5,6,7,8,9,10,11,12,13,14,15,2,17.

Je pense que le curseur est déplacé vers les deux tables (while (rs.next())). Est-il possible de déplacer le curseur sur les lignes d'une seule table parmi plusieurs tables? Ou y a-t-il une autre meilleure solution pour mon problème?

Désolé pour le poste long. Merci d'avance.

+2

'SELECT * FROM T1, T2' sans la clause WHERE ne fait une [Cross requête de jointure] (http://www.w3resource.com/sql/joins /cross-join.php), à savoir qu'il combine chaque ligne de T1 avec chaque ligne de T2. Si la table T1 a 100 lignes et la table T2 a 200 lignes, vous obtiendrez 100 * 200 = 20000 lignes dans le jeu de résultats. Je ne suis pas sûr si c'est votre intention réelle. – krokodilko

+1

Pour référence future, ne postez pas un cas de test avec dix-sept colonnes lorsque quatre feront l'affaire. Si vous voulez que les gens vous aident, ne leur faites pas défiler le texte de votre code en essayant de comprendre ce qui se passe. En outre, des exemples de données avec des valeurs évidemment différentes pour les deux tables aideraient. – APC

Répondre

0

Vous avez la solution. :)

Il y avait deux « erreurs » dans mon code:

1) Je voulais avoir une jointure interne, mais a traversé requête de jointure. Merci @krokodilko pour le commentaire rapide.

2) Je ne suis pas censé utiliser le nom de colonne avec des lettres majuscules et minuscules (opération invalide). J'ai changé tous les petits caractères en capital.

La nouvelle requête SQL est:

("SELECT T1.ID, T1.X, T1.Y , T1.XE , T1.YE , T1.SDE , T1.XS , T1.YS , T1.SDS , T1.XW , T1.YW , T1.SDW , T1.XN , T1.YN , T1.SDN , T2.ID , T2.ZN FROM T1 , T2 WHERE T1.ID = T2.ID")