sql >> データベース >  >> RDS >> Mysql

1つのステートメントでJavaで実行される複数のクエリ

    JDBCを使用してこのようなことを実行できるかどうか疑問に思いました。

    "SELECT FROM * TABLE;INSERT INTO TABLE;"
    

    はい、可能です。私の知る限り、2つの方法があります。彼らは

    1. データベース接続プロパティを設定して、デフォルトでセミコロンで区切られた複数のクエリを許可する。
    2. カーソルを暗黙的に返すストアドプロシージャを呼び出す。

    次の例は、上記の2つの可能性を示しています。

    例1 :(複数のクエリを許可するには):

    接続要求を送信するときに、接続プロパティallowMultiQueries=trueを追加する必要があります データベースのURLに。これは、autoReConnect=trueのように、すでに存在する場合の追加の接続プロパティです。 など。allowMultiQueriesの許容値 プロパティはtruefalseyes 、および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. 1つ以上のselectを使用してプロシージャを作成します 、およびDML クエリ。
    2. CallableStatementを使用してJavaから呼び出します 。
    3. 複数のResultSetをキャプチャできます sプロシージャで実行されます。
      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. CTEからテーブルのレコードを更新します

    2. 致命的なエラー:未定義の関数mysql_connect()の呼び出し

    3. MySQLでのクエリパフォーマンスの最適化

    4. メッセージ8672、レベル16、状態1、行1 MERGEステートメントが、同じ行を複数回更新または削除しようとしました