2013-08-29 12 views
5

My jdbc sürücüsü mysql db sürüm 5.1.25'tir.Noktalı virgülle ayrılmış birden çok soruyu MySQL Connector/J ile yürütebilir miyim?

statement.execute("select fullName from user where user_id=1; select fullName from user where user_id=2"); 

Ve her zaman özel durumu alıyorsunuz:

ben şöyle sql sorguyu yürütmek istiyoruz

Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select fullName from user where user_id=2' at line 1 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
    at com.mysql.jdbc.Util.getInstance(Util.java:386) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4187) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4119) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2809) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2758) 
    at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:894) 
    at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:732) 
    at dbViewer.model.UserConnectionManager.retrieveRoutinesNames1(UserConnectionManager.java:622) 
    at dbViewer.model.UserConnectionManager.main(UserConnectionManager.java:637) 

ANCAK bu aynı sorguyu çalıştırdığınızda çalıştığını komut satırından (noktalı virgülle ayrılmış) mükemmel ve beklendiği gibi iki tablo çıktılar.

+0

Muhtemelen değil - iki sonuç kümelerini döneceğini sql ne yürütmek tarafından döndürülen olacak()? Muhtemelen tek bir beyanınız varsa her şey yolunda mı? – DaveRlz

+0

Tek bir sorguda birden çok ifadeye izin vermemek de mükemmel bir güvenlik önlemi değildir. Birden çok sorguyu yürütürseniz, enjeksiyon bir saldırganın tamamen keyfi SQL yürütmesine izin verebilir: http://xkcd.com/327. 'WHERE user_id = 1 OR user_id = 2' kullanıcısından fullName seçmelisiniz. SQL enjeksiyonuna karşı verimlilik ve güvenlik için hazırlanmış ifadeler de kullanmalısınız. – yshavit

cevap

1

Hayır yapamazsınız. Statement.execute (...) 'i arayarak neler bekliyorsunuz? Bir ResultSet (... bir tablo anlamına gelir) verir.

"Her iki sonucu da geri almak için" kullanıcı adının (1, 2) içinde kullanıcı adının tam adını seçin "ifadesini çağırmanız yeterlidir.

JDBC ifadelerinde noktalı virgüllere sahip olmak genelde çok hatalıdır. Bazı JDBC sürücüleri bunu desteklemez (örneğin, SQL deyiminizi ";" ile kapatırsanız, IBM'in DB2 10.x için JDBC sürücüsü bir istisna atar.

9

Çoğu veritabanının bir sorgusunda ; kullanmak, genellikle deyim sözdiziminin kendisinin bir parçası olmadığı, ancak komut satırını veya komut dosyalarını ayrı ayrı deyimlere atayan bir sonlandırıcı olarak çalışmaz. Komut satırı veya komut dosyası işlemcisi, ifadenin tamamlandığı ve sunucuya gönderilebileceği sinyal olarak bir yarım virgül görür.

Ayrıca JDBC tek deyimi hazırlamak (veya yürütme) sadece izin verilmez bir gerçek deyimi birden çok ifadeleri olmalı ve böylece (bazı gelince çoğu orada bir noktalı virgül olması gerek de olduğunu ve?) veritabanları yarı-kolon deyim sözdiziminin bir parçası değildir, sadece bir dahil etmek için bir sözdizimi hatasıdır.

Birden çok deyimi çalıştırmak istiyorsanız, ayrı yürütmeler kullanmanız gerekir. Teknik olarak, MySQL'in bir bağlantı özelliği tarafından etkinleştirilebilen çoklu yürütmeleri destekleme seçeneği vardır. Bu davranış, JDBC belirtimi/API'siyle uyumlu değildir ve kodunuzu daha az taşınabilir hale getirir. Öyle gibi sql sorguyu yürütmek istiyoruz Driver/Datasource Class Names, URL Syntax and Configuration Properties for Connector/J

8

üzerine allowMultiQueries Bkz:

statement.execute("select fullName from user where user_id=1; select fullName from user where user_id=2");

Bu, birden fazla sorguları izin vermek bir veritabanı bağlantısı özelliği belirledik yalnızca mümkündür hepsini bir kerede yürütmek için. Ve özellik adı allowMultiQueries=true olduğunu. Bu özellik, sunucuya bir veritabanı bağlantısı isteği ile birlikte ayarlanmalı ve gönderilmelidir. Genel sözdizimi şu şekildedir: Bu ek bağlantı özelliği olanlar için

String dbUrl = "jdbc:mysql:///test?allowMultiQueries=true"; 

eğer zaten allowMultiQueries özellik için

kabul edilebilir değerler true, false, yes ve no vb, autoReConnect=true gibi bazı, bulunmaktadır. Başka bir değer, çalışma zamanında SQLException ile reddedilir.

execute(String sql) veya diğer türevlerini kullanarak sorgu yürütme sonuçlarını getirmeniz gerekir. ,

  • Multiple queries executed in java in single statement SO benzer ilanları
    • Bir:

      multiQuerySqlString = "select fullName from user where user_id=1; "; 
      multiQuerySqlString += "select fullName from user where user_id=2; "; 
      // you can multiple types of result sets 
      multiQuerySqlString += "select last_login from user_logs where user_id=1; "; 
      
      boolean hasMoreResultSets = stmt.execute(multiQuerySqlString); 
      

      arasında sırayla dolaşma ve süreç aşağıdaki adımları gerektirir sonuçları:

      int rsNumber = 0; 
      while (hasMoreResultSets) { 
          rsNumber += 1; 
          Resultset rs = stmt.getResultSet(); 
      
          // based on the structure of the result set, 
          // you can handle column values. 
          if (rsNumber == 1) { 
           while(rs.next()) { 
            // handle your rs here 
           } // while rs 
          } // if rs is 1 
          else if (rsNumber == 2) { 
           // call a method using this rs. 
           processMyResultSet(rs); // example 
          } // if rs is 2 
          // ... etc 
      
          // check whether there exist more result sets 
          hasMoreResultSets = stmt.getMoreResults(); 
      } // while results 
      

      bakın için hangi için verdi Cevap.

İlgili konular