質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

3回答

9900閲覧

oracleのsql plusでsql実行した時のトランザクションについて

enigumalu

総合スコア192

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2017/10/25 04:58

いつもmysqlを利用しておりsql実行する際に下記のようなトランザクションを貼る処理を
実行してから行っているのですが、これはoracleでは別のコマンドがあるのでしょうか?
oracle11でsql plusを利用しています

use dbname; begin; sql文 commit;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

要約

・MySQLはトランザクションの開始には明示的な宣言が必要。
・Oracleは自動的にトランザクションが開始される。

参考

トランザクションの開始および終了は各リファレンスには次のように書かれています。

MySQL

次のステートメントにより、トランザクションの使用を制御できます。
・START TRANSACTION または BEGIN は、新しいトランザクションを開始します。
・COMMIT は、現在のトランザクションをコミットして、その変更を永続的なものにします。
・ROLLBACK は、現在のトランザクションをロールバックして、その変更を取り消します。

Oracle

トランザクションの開始および終了方法

トランザクションは、プログラムの最初の実行SQL文(CONNECT以外)により開始します。1つのトランザクションが終了すると、次の実行SQL文により別のトランザクションが自動的に開始します。このように、すべての実行文はトランザクションの一部です。宣言SQL文は、ロールバックできず、コミットも必要ないため、トランザクションの一部とはみなされません。

トランザクションは、次のいずれかの方法で終了します。

COMMIT文またはROLLBACK文を記述し、RELEASEオプションは付けても付けなくてもかまいません。これにより、データベースへの変更を明示的に確定または取り消します。

実行の前と後に自動コミットを発行するデータ定義文(ALTER、CREATEまたはGRANTなど)を記述します。これにより、データベースへの変更を暗黙的に確定します。

投稿2017/10/25 05:38

sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

sqlplus username1/password1@orcl1
INSERT, UPDATE, DELETE, MERGE など ;
COMMIT ;
exit

投稿2017/10/25 05:02

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

enigumalu

2017/10/25 05:14

beginという概念はないんですか?
enigumalu

2017/10/25 05:37

updateを3回実行するのですが3回実行後 ROLLBACKしたら3回全てROLLBACKされるのでしょうか? sqlplus username1/password1@orcl1 UPDATE **1; UPDATE **2; UPDATE **3; ROLLBACK ; exit
sazi

2017/10/25 05:48

>Orlofskyさん PL/SQLでのBEGINは制御ブロックの開始を宣言するものであって、トランザクションの開始を宣言するものではないですよね?
Orlofsky

2017/10/25 05:51

SAVEPOINTをしてあればSAVEPOINTまでROLLBACKされ、 SAVEPOINTがなければ前回のCOMMT, ROLLBACK またはDDL(ALTER TABLEなどで暗黙のCOMMITが実行される)までROLLBACK されます。
Orlofsky

2017/10/25 05:53

saziさん、PL/SQL の BEIGN はトランザクションの開始ではありません。
guest

0

Oracle はデータの変更を行った際、暗黙的に更新トランザクションを開始します。
また、それ以外に明示的にトランザクションを開始する手段として、
・SET TRANSACTION
を呼び出すというのがあります。これが BEGIN に相当します。

投稿2017/10/25 05:33

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2017/10/25 05:42

SET TRANSACTIONはBEGIN相当ではなく、開始したトランザクションに対する制御では?
sazi

2017/10/25 05:52

ここの記述ですか? >トランザクションの開始 >トランザクションは、最初の実行可能SQL文が検出された時点で開始されます。実行可能SQL文は、DML文やDDL文、およびSET TRANSACTION文など、データベース・インスタンスへのコールを生成するSQL文のことです。 この記述では「実行可能SQL文」にSET TRANSACTION文が含まれると書いてあるだけで、トランザクションの開始は「実行可能SQL文が検出された時点」とあります。 なので、純粋にトランザクションを開始する命令では無いと思うのですが?
tacsheaven

2017/10/25 06:06

そのページの 表10-1 を読んでみてください。
sazi

2017/10/25 06:21 編集

表10-1 はあくまで「トランザクション制御の基本概念」であって、その命令で実行される内容が説明されているだけだと思います。 文法的にもBEGIN相当であれば「SET TRANSACTION」のみで良いはずですが、何かしらの制御を指定する必要があります。 https://docs.oracle.com/cd/E60665_01/db112/SQLRF/statements_10005.htm なおかつ、先にコメントした同一のページにある「トランザクションの開始」の説明からもBEGIN相当でないことは明らかだと思うのですが?
sazi

2017/10/25 06:37 編集

例えば、 SET TRANSACTION NAME 'hoge'; UPDATE ~; SET TRANSACTION NAME 'hogehoge'; COMMIT; とした場合エラーにはなりませんが、「SET TRANSACTION」がBIGIN相当だと解釈するならどのようにトランザクションが制御されますか?
tacsheaven

2017/10/25 06:38

SET TRANSACTION; だけでいいんですよ? NAME も READ (ONLY or WRITE) や ISOLATION LEVEL も、オプションなのです。 省略した場合、SET TRANSACTION READ WRITE; 相当になります Oracle の処理から見ると、SET TRANSACTION に限らず、たいていの SQL 命令が来ると、トランザクションが開始されます。逆に言うと、トランザクションを開始「するだけ」の命令としては、SET TRANSACTION を使うことになります。
sazi

2017/10/25 06:47

>SET TRANSACTION; だけでいいんですよ? (リファレンスにも省略可能とはなっていませんし)それだとエラーになります 議論したいのはBEGIN相当かどうかなのです。
tacsheaven

2017/10/25 07:12

ならば単に SET TRANSACTION READ ONLY か SET TRANSACTION READ WRITE と書けば済む話です。MySQL で BEGIN とだけ書いた場合にどちらになるかは、MySQL の設定によって異なる(デフォルトトランザクションは通常 READ WRITE ですが、READ ONLY にも設定できる)ので、一概には言えません。 そもそもトランザクションを入れ子にしようとすること自体が根本的に誤っているのですけれどもね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問