2011-08-24 56 views
14

私は1つの移動で複数のSQL文を実行することが可能かどうか疑問に思っていました。 たとえば、私は複数のテーブルから行を削除するシナリオは、私が...MyBatisは複数のSQL文を一度に実行することは可能ですか?

<delete id="delete" parameterType="String"> 
    DELETE FROM DUMMYTABLE_A where X=${value} 
    DELETE FROM DUMMYTABLE_B where X=${value} 
</delete> 

答えて

14

のようなものを行うことができる方法があるはい、ほとんどのデータベースは、これを許可します。通常は、SQLステートメントを何かで区切る必要があります。 PostGRESとMySQLではセミコロン(;)です。 Microsoft SQLサーバーでは、キーワードGOを使用する必要があります。 [2013年5月更新:SQL Server 2012の時点では、ステートメントの区切りにセミコロンを使用する必要があります。 SQL Server 2012(つまり、次のバージョン以降)の後は、これらは必須となります。 GOを使用することは、SQL2012以降のことをやめることになりました。 ]

のMySQL/Postgresの例:

DELETE FROM DUMMYTABLE_A where X=${value}; 
DELETE FROM DUMMYTABLE_B where X=${value}; 
DELETE FROM DUMMYTABLE_C where X=${value}; 

MS-SQL例:またTRAN/ROLLBACK TRAN/COMMIT TRANをBEGINとの取引をサポートします

DELETE FROM DUMMYTABLE_A where X=${value} 
GO 
DELETE FROM DUMMYTABLE_B where X=${value} 
GO 
DELETE FROM DUMMYTABLE_C where X=${value} 

ベター・データベース(すなわちないのMySQL。) 。トランザクションを使用すると、実際にすべてのステートメントを1つのアトミック操作にバッチすることができます。ここで、その一部が失敗した場合、3つすべてがロールバックされます。これらの詳細については、http://www.sqlteam.com/article/introduction-to-transactionsを参照してください。

ほとんどの場合、必要なのはSQL文のセミコロンだけです。

+1

私はあなたがそれを持つ2つの文を分離しないことがわかりますhttps://gist.github.com/AdelinGhanaem/b565ca3a447e89087ab7次の要旨を添付しています私は知らないが、これは私のために動作しません。ロールバックと同様に 'クエリ' ... – Adelin

+2

私はこの方法を試して、myBatisは例外を投げました。問題は、JDBC URLでallowMultiQueries = trueフラグを設定しなかったことです。ありがとう。 –

+0

これは私のためにもうまくいきません。私は 'in '条件で2つのデータバッチを削除しようとしていますが、SQL文法の構文エラーがあります。 –

16

私はOracleでmyBatisを使用しています。他のDBにも同様のものがあると思います。実際には、DBでプロシージャを作成することはできますが、プロジェクトをサポートする必要があるときは、通常は将来的にはより良いでしょう。

<delete id="deleteUnfinishedData" parameterType="map"> 
    {call 
     declare 
     begin 
      delete from TABLE1 where id = #{valueFromMap1}; 
      delete from TABLE2 where id = #{valueFromMap2}; 
     end 
    } 
</delete> 
+1

オラクルはこのトピックの特別な獣です。その例を示してくれてありがとう、今日私が必要としていたことだけ。 – Marc

+0

チャームのように働いた。ありがとう! –

+0

これはどのようにSQL Server用に変更できますか? – SMKS

関連する問題