我想知道是否可以使用JDBC执行类似的 *** 作。
"SELECt FROM * TABLE;INSERT INTO TABLE;"
是的,有可能。据我所知,有两种方法。他们是
- 通过设置数据库连接属性以允许多个查询,默认情况下用分号分隔。
- 通过调用返回隐式游标的存储过程。
以下示例演示了上述两种可能性。
示例1 :(允许多个查询):
发送连接请求时,您需要将连接属性附加
allowMultiQueries=true到数据库URL。这是额外的连接属性,如果那些已经存在的一些,比如
autoReConnect=true,对等。可接受的值
allowMultiQueries属性是
true,
false,
yes,和
no。其他任何值在运行时都会被拒绝
SQLException。
String dbUrl = "jdbc:mysql:///test?allowMultiQueries=true";
除非通过了此类指令,否则
SQLException将引发an 。
您必须使用
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 :要遵循的步骤:
- 创建一个或多个过程
select
,并进行DML
查询。 - 使用从Java调用它
CallableStatement
。 - 您可以捕获
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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)