Mysql
 sql >> база данни >  >> RDS >> Mysql

Множество заявки, изпълнени в Java в един израз

Чудех се дали е възможно да се изпълни нещо подобно с помощта на JDBC.

"SELECT FROM * TABLE;INSERT INTO TABLE;"

Да, възможно е. Има два начина, доколкото знам. Те са

  1. Като зададете свойството за свързване към базата данни, за да разрешите множество заявки, разделени с точка и запетая по подразбиране.
  2. Чрез извикване на съхранена процедура, която връща неявно курсори.

Следващите примери демонстрират горните две възможности.

Пример 1 :(За да разрешите множество заявки):

Докато изпращате заявка за връзка, трябва да добавите свойство за връзка allowMultiQueries=true към URL адреса на базата данни. Това е допълнително свойство за свързване към тези, ако вече съществуват, като autoReConnect=true , и т.н.. Приемливи стойности за allowMultiQueries свойствата са true , false , yes и no . Всяка друга стойност се отхвърля по време на изпълнение с SQLException .

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

Освен ако такава инструкция не е предадена, SQLException се хвърля.

Трябва да използвате execute( String sql ) или други негови варианти за извличане на резултати от изпълнението на заявката.

boolean hasMoreResultSets = stmt.execute( multiQuerySqlString );

За да повторите и обработите резултатите, ви трябват следните стъпки:

READING_QUERY_RESULTS: // label  
    while ( hasMoreResultSets || stmt.getUpdateCount() != -1 ) {  
        if ( hasMoreResultSets ) {  
            Resultset rs = stmt.getResultSet();
            // handle your rs here
        } // if has rs
        else { // if ddl/dml/...
            int queryResult = stmt.getUpdateCount();  
            if ( queryResult == -1 ) { // no more queries processed  
                break READING_QUERY_RESULTS;  
            } // no more queries processed  
            // handle success, failure, generated keys, etc here
        } // if ddl/dml/...

        // check to continue in the loop  
        hasMoreResultSets = stmt.getMoreResults();  
    } // while results

Пример 2 :Стъпки, които да следвате:

  1. Създайте процедура с един или повече select и DML запитвания.
  2. Извикайте го от java с помощта на CallableStatement .
  3. Можете да заснемете множество ResultSet се изпълнява в процедура.
    Резултатите от DML не могат да бъдат заснети, но могат да издадат друг select
    за да разберете как са засегнати редовете в таблицата.

Примерна таблица и процедура :

mysql> create table tbl_mq( i int not null auto_increment, name varchar(10), primary key (i) );
Query OK, 0 rows affected (0.16 sec)

mysql> delimiter //
mysql> create procedure multi_query()
    -> begin
    ->  select count(*) as name_count from tbl_mq;
    ->  insert into tbl_mq( names ) values ( 'ravi' );
    ->  select last_insert_id();
    ->  select * from tbl_mq;
    -> end;
    -> //
Query OK, 0 rows affected (0.02 sec)
mysql> delimiter ;
mysql> call multi_query();
+------------+
| name_count |
+------------+
|          0 |
+------------+
1 row in set (0.00 sec)

+------------------+
| last_insert_id() |
+------------------+
|                3 |
+------------------+
1 row in set (0.00 sec)

+---+------+
| i | name |
+---+------+
| 1 | ravi |
+---+------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Процедура за обаждане от Java :

CallableStatement cstmt = con.prepareCall( "call multi_query()" );  
boolean hasMoreResultSets = cstmt.execute();  
READING_QUERY_RESULTS:  
    while ( hasMoreResultSets ) {  
        Resultset rs = stmt.getResultSet();
        // handle your rs here
    } // while has more rs


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Извличане на подниз на MySQL с помощта на разделител

  2. PDOException SQLSTATE[HY000] [2002] Няма такъв файл или директория

  3. Защо приблизителният брой редове е много различен в резултатите от phpmyadmin?

  4. Синтаксис на SQL UPDATE – Изброен от СУБД

  5. ADDDATE() Примери – MySQL