DMLと事務制御


データベース操作言語DLL
データ操作言語DLL(Data Manipulation Language)は、データベース内のデータを操作するために使用されます。
新しいデータを出入りする
既存のデータを修正
不要なデータを削除します。
データ統合
insert文
insert文は表にデータを挿入するための文です。
構文:
insert into table[(column[,column...])]
values(value[,value...])
-----------------------------------------------------------------
insert into dept values(88,'   ','  ');
insert into dept (deptno,dname) values(99,'   ');
説明:
insert文は毎回表に一つのレコードしか挿入できません。
デフォルトフィールド名リストの場合は、新規にレコードに挿入するフィールドごとに新しい値を設定します。
また、insert文で指定された割り当てフィールドのリストは、一部のフィールドの明示的な設定のためだけに追加され、残りのフィールドは、デフォルトの割り当て値nullになります。
テーブル間データコピー
insert文でサブクエリを使って表間データのコピーが可能です。
insert into depta(id,name) select deptno,dname from dept;
説明:
この時はvalues子文を与える必要はありません。
サブクエリの値リストは、insertサブフレーズのフィールドリストに対応しています。
udata文
udata文は表のデータを更新するために使用されます。
update   table
set column = value[,column=value,...]
[where condition];
--------------------------------------------------------------
update emp set sal=sal+88;
update emp set sal=sal+1000,comm=comm+0.7
where empno=7778;
説明:
uudate文は毎回複数の記録を更新できます。
where子文を使って更新したい記録を限定してもいいです。デフォルトの場合は、表のすべてのレコードを更新します。
delete文
delete文はテーブルからデータを削除するために使用されます。
delete [from] table
[where condition];
---------------------------------------------------
delete emp;
delete from emp;
delete emp where empno=7778;
 
説明:
delete文は毎回複数のレコードを削除できます。
where子文を使用して、削除するレコードを限定します。もしデフォルトであれば、表のすべてのレコードを削除します。
merge文
merge文は、データ統合のために使用されます。条件に応じて、表に行データの修正または挿入操作を行います。挿入するレコードがターゲットテーブルに既に存在する場合、更新操作を実行します。そうでなければ、挿入を実行します。
merge into table [alias]
using (table | view | sub_query) [alias]
on(join_condition)
when matched then
         update set col1=col1_val,col2=col2_val
when not matched then
         insert(column_list)values(column_values);
 
create table test1(
eid number(10),
name varchar2(20),
birth date,
salary number(8,2)
);
insert into test1 values(1000,'  ','20-5-76',3300);
insert into test1 values(1001,'  ','12-3-90',6200);

create table test2(eid number(10),name varchar2(20),birth date,salary number(8,2));

select * from test2;

merge into test2
using test1
on(test1.eid=test2.eid)
when matched then
update set name=test1.name,birth,salary=test1.salary
when not matched then
insert(eid,name,birth,salary)values(test1.eid,test1.name,test1.birth,test1.salary);

select * from test2;
コントロール 
事務(Transaction)
単一の論理工作ユニットを構成する一連の動作を事務と呼ぶ。
データベース事務構成
0~複数のDML文
1つのDDL(Data Define Language)文
1条DCL(Data Control Language)文
コントロール
エラーリカバリを簡略化するために、関連する一連の動作を一つのグループにまとめることによって、あるいは全部成功するか、あるいは全部失敗した論理工作ユニットを組み合わせることによって、アプリケーションの信頼性を向上させる。
トランザクションが満たすべきACID属性
原子性(Atomicity)
コンセンサス(Conssistency)
隔離性(Isolation)
耐久性(Durability)
事務の開始と終了
トランザクションの開始は、最初の実行可能なステートメントです。
トランザクションの終了:
comitやrollback文に出会う
DDLまたはDCL文に出会う
ユーザセッション終了
システム崩壊
事務の提出とスクロール
明示的な提出とロールバック動作は、データの整合性をより良く保証するために。
下記の場合、事務は自動的に提出されます。
DDL文を実行します。
DCL文を実行します。
セッションを正常に終了します
セッション異常終了/システム崩壊時に自動的にロールバックされます。
SqlPlusの自動提出
Sql Plusがsql文を実行する場合、自動的に提出するかどうかを設定できます。
表示設定:
ショー・キャット・キャット
     atocomit OFF
     atocomit IMMEDIATE
設定を変更:
set aut comit on
セットダウン
提出/ロールバック前データ状態
  • 現在のトランザクションにおけるデータ状態の変化時に回復できる
  • 現在のトランザクションにおけるDMMの操作結果は、現在のユーザ(セッション)のみに対してのみ見られ、他のユーザ(セッション)は、現在のトランザクションにおけるデータ状態の変化が見えなくなり、現在のトランザクションが終了するまでは、
  • 現在のトランザクションにおけるDML文に関する世代同期は、他のユーザ(セッション)によって修正操作ができません。
  • 事務提出後のデータ状態
  • データの修正は恒久的に有効になり、
  • を再取り消すことができません。
  • データ以前の状態が恒久的に失われ、
  • を回復できませんでした。
  • すべてのユーザ(セッション)は、動作後の結果を見るであろう。
  • 記録ロックが解放され、他のユーザがこれらを修正する
  • 事務における保存点(Savepoints)は
  • をクリアした。
    事務ロールバック後のデータ状態
  • データの修正がキャンセルされました。
  • データは修正前の状態に戻りました。
  • 記録ロックが解除されました。
    点を保存
    保存点を通じて現在の事務にマークを作成し、将来は指定されたマーク(保存点)に戻して、事務の一部をロールバックさせます。
    insert into dept values(12,'Peter','Beijing');
    insert into dept values(22,'Mark','Shanghai');
    savepoint p1;
    insert into dept values(44,'Tom','Shenzhen');
    ------------------
    select  * from dept;
    
    rollback to p1;
    select * from dept;