データの操作の使用

Oracleは、データベース内のデータ操作を実行するためのデータ操作言語コマンドを提供します。データ操作では、必要に応じて、データベーステーブルにアプリケーションまたはビジネスデータを入力し、データを変更し、データベースからデータを削除できます。データ操作の他に、これらの操作を制御するために使用される一連のコマンドがあります。これらのコマンドは、トランザクション制御言語としてグループ化されています。

論理SQLトランザクションに関係するDMLステートメントには、挿入、更新、削除、マージの3種類があります。トランザクションは、データベースセッション内のDMLアクションの論理コレクションです。

INSERTステートメント

INSERTコマンドは、データをテーブルに格納するために使用されます。INSERTコマンドは、VisualBasic.NETやC ++などの高級プログラミング言語で埋め込みSQLコマンドとしてよく使用されます。ただし、このコマンドは、コマンドモードのSQL * PLUSプロンプトでも実行できます。INSERTコマンドには2つの異なる形式があります。最初の形式は、新しい行の各列に値が挿入される場合に使用されます。INSERTコマンドの2番目の形式は、列データの一部が不明であるか、別のビジネスロジックからデフォルト設定されている行を挿入するために使用されます。この形式のINSERTコマンドでは、データが格納される列名を指定する必要があります。

構文:

テーブル内のすべての列の値が明確で既知である場合は、以下の構文に従うことができます。

INSERT INTO table
VALUES (column1 value, column2 value, 
...);

以下の構文は、テーブルのいくつかの列に値を入力する必要がある場合に使用できます。残りの列は、NULLとして、または別のビジネスロジックから値を推測できます。

INSERT INTO table (column1 name, column2 name, . . .)
VALUES (column1 value, column2 value, . . .);

以下のINSERTステートメントは、EMPLOYEESテーブルに新しい従業員レコードを作成します。プライマリ列EMPLOYEE_ID、FIRST_NAME、SALARY、およびDEPARTMENT_IDの値が挿入されることに注意してください。

INSERT INTO employees (EMPLOYEE_ID, FIRST_NAME, SALARY, DEPARTMENT_ID)
VALUES (130, 'KEMP', 3800, 10);

それ以外の場合は、以下のINSERTステートメントを使用して列リストを指定せずに完全な従業員データをEMPLOYEESテーブルに挿入できます。ただし、値が事前にわかっていて、テーブル内の列のデータ型と位置に準拠している必要があります。

INSERT INTO employees
VALUES (130, 'KEMP','GARNER', '[email protected]', '48309290',TO_DATE ('01-JAN-2012'), 'SALES', 3800, 0, 110, 10);

挿入する値は、列のデータ型と互換性がある必要があります。リテラル、固定値、および関数、SYSDATE、CURRENT_DATE、SEQ.CURRVAL(NEXTVAL)、USERなどの特殊な値を列値として使用できます。指定する値は、一般的な規則に従う必要があります。文字列リテラルと日付値は引用符で囲む必要があります。日付値はDD-MON-RRまたはD-MON-YYYY形式で指定できますが、世紀を明確に指定し、内部のRR世紀計算ロジックに依存しないため、YYYYが推奨されます。

INSERT-AS-SELECT(IAS)ステートメント

INSERT..AS..SELECT(IAS)操作を使用して、ソーステーブルからターゲットテーブルにデータを入力できます。そのダイレクトパス読み取り操作。あるテーブルから別のテーブルへのデータのコピーを作成する、またはソーステーブル操作がオンラインであるテーブルのバックアップコピーを作成する簡単な方法です。

たとえば、データをEMPLOYEESテーブルからEMP_HISTORYテーブルにコピーできます。

INSERT INTO EMP_HISTORY
SELECT EMPLOYEE_ID, EMPLOYEE_NAME, SALARY, DEPARTMENT_ID
FROM employees;

UPDATEステートメント

UPDATEコマンドは、列に格納されているデータを変更します。WHERE句で指定された条件でフィルタリングされた結果セットに応じて、一度に1行または複数行を更新できます。列の更新は、列の変更とは異なることに注意してください。この章の前半で、ALTERコマンドについて学習しました。ALTERコマンドはテーブル構造を変更しますが、テーブルデータは影響を受けません。UPDATEコマンドは、テーブル構造ではなく、テーブル内のデータを変更します。

構文:

UPDATE table
SET column = value [, column = value ...]
[WHERE condition]

構文から、

SET column =式は、指定された列名のデータを更新する文字、数式、または関数の任意の組み合わせにすることができます。WHERE句はオプションですが、含まれている場合は、更新する行を指定します。1つのテーブルのみが可能です。 UPDATEコマンドで一度に更新されます。

以下のUPDATEステートメントは、従業員JOHNの給与を5000に更新します。

UPDATE employees
SET salary = 5000
WHERE UPPER (first_name) = 'JOHN';

WHERE述部はオプションですが、テーブル内の必要な行のみを変更するように論理的に追加する必要があります。以下のUPDATEステートメントは、テーブル内のすべての従業員の給与を更新します。

UPDATE employees
SET salary = 5000;

SET句で複数の列をコンマで区切って指定することにより、複数の列を更新することもできます。たとえば、JOHNの給与と職務の両方をそれぞれ5000とSALESに変更する必要がある場合、UPDATEステートメントは次のようになります。

UPDATE employees
SET	SALARY = 5000,
	JOB_ID = 'SALES'
WHERE UPPER (first_name) = 'JOHN';

1 row updated.

同じ行の複数の列を更新する別の方法は、サブクエリの使用法を示しています。

UPDATE employees
SET (SALARY, JOB_ID) = (SELECT 5000, 'SALES' FROM DUAL)
WHERE UPPER (ENAME) = 'JOHN'

DELETEステートメント

DELETEコマンドは、最も単純なSQLステートメントの1つです。テーブルから1つ以上の行を削除します。SQLでは複数のテーブル削除操作は許可されていません。DELETEコマンドの構文は次のとおりです。

DELETE FROM table_name
    [WHERE condition];

DELETEコマンドは、オプションのWHERE句の条件を満たすテーブル内のすべての行を削除します。WHERE句はオプションであるため、WHERE句はDELETE操作の範囲を制限するため、WHERE句を省略することで、テーブルからすべての行を簡単に削除できます。

以下のDELETEステートメントは、EDWINの詳細をEMPテーブルから削除します。

DELETE employees
WHERE UPPER (ENAME) = 'EDWIN'

1 row deleted.

注:DELETE [TABLENAME]とDELETEFROM [TABLENAME]は同じ意味を持ちます。

条件付き削除ステートメントのWHERE条件は、以下に示すようにサブクエリを利用できます。

DELETE FROM employees
WHERE DEPARTMENT_ID IN (SELECT DEPARTMENT_ID
				    FROM LOCATIONS
				    WHERE LOCATION_CODE = 'SFO')

切り捨てる

Truncateは、テーブルからすべてのレコードをフラッシュするために使用されるDDLコマンドですが、テーブル構造は保持されます。選択したレコードを削除するWHERE条件はサポートされていません。

構文:

TRUNCATE [table name]

これは自動コミットです。つまり、セッションで現在アクティブなトランザクションをコミットします。テーブルを切り捨てても、依存インデックス、トリガー、またはテーブル制約は削除されません。テーブルAがデータベース内のテーブルBの参照制約の親である場合、テーブルAを切り捨てることはできませんでした。

トランザクション

トランザクションは、データベースで実行される作業の論理単位です。次のいずれかを含めることができます-

  • TCLコマンドで終わる複数のDMLコマンド(COMMITまたはROLLBACK)

  • 1つのDDLコマンド

  • 1つのDCLコマンド

トランザクションの開始は、最初のDMLコマンドでマークされます。TCL、DDL、またはDCLコマンドで終了します。TCLコマンド、つまりCOMMITまたはROLLBACKは、アクティブなトランザクションを終了するために明示的に発行されます。基本的な動作により、データベースセッションでDDLまたはDCLコマンドのいずれかが実行された場合は、セッションで進行中のアクティブなトランザクションをコミットします。データベースインスタンスが異常にクラッシュした場合、トランザクションは停止します。

COMMIT、ROLLBACK、およびSAVEPOINTは、トランザクション制御言語です。COMMITはデータの変更をデータベースに永続的に適用し、ROLLBACKはアンチコミット操作を実行します。SAVEPOINTは、さまざまなトランザクションステージでマーカーを設定することにより、一連のトランザクションを制御します。ユーザーは、現在のトランザクションを、前に設定した目的の保存ポイントにロールバックできます。

COMMIT-Commitは、データの変更をデータベーステーブルに永続的に適用することにより、現在アクティブなトランザクションを終了します。COMMITは、トランザクションを明示的に終了するTCLコマンドです。ただし、DDLおよびDCLコマンドは暗黙的にトランザクションをコミットします。

SAVEPOINT-セーブポイントは、セッション内の現在のトランザクションの特定のポイントをマークするために使用されます。これはトランザクションの論理マーカーであるため、データディクショナリでセーブポイントを照会することはできません。

ROLLBACK-ROLLBACKコマンドは、データの変更を破棄してトランザクション全体を終了するために使用されます。トランザクションにマークされたセーブポイントが含まれている場合、ROLLBACK TO SAVEPOINT [name]を使用して、指定されたセーブポイントまでのみトランザクションをロールバックできます。その結果、指定されたセーブポイントまでのすべてのデータ変更は破棄されます。

デモンストレーション

毎年第1四半期に新入社員の詳細が入力されるEMPLOYEESテーブルについて考えてみます。事務スタッフは、データフィードアクティビティ中の任意の時点で障害のあるデータをロールバックするために、各従業員の詳細にセーブポイントを追加します。彼はセーブポイント名を従業員名と同じに保つことに注意してください。

INSERT INTO employees (employee_id, first_name, hire_date, job_id, salary, department_id)
VALUES (105, 'Allen',TO_DATE ('15-JAN-2013','SALES',10000,10);

SAVEPOINT Allen;

INSERT INTO employees (employee_id, first_name, hire_date, job_id, salary, department_id)
VALUES (106, 'Kate',TO_DATE ('15-JAN-2013','PROD',10000,20);

SAVEPOINT Kate;

INSERT INTO employees (employee_id, first_name, hire_date, job_id, salary, department_id)
VALUES (107, 'McMan',TO_DATE ('15-JAN-2013','ADMIN',12000,30);

SAVEPOINT McMan;

データ供給オペレーターが、「Kate」と「McMan」の給与を誤って入力したことに気付いたとします。彼はアクティブなトランザクションをセーブポイントKateにロールバックし、KateとMcManの従業員の詳細を再入力します。

ROLLBACK TO SAVEPOINT Kate;

INSERT INTO employees (employee_id, first_name, hire_date, job_id, salary, department_id)
VALUES (106, 'Kate',TO_DATE ('15-JAN-2013','PROD',12500,20);

SAVEPOINT Kate;

INSERT INTO employees (employee_id, first_name, hire_date, job_id, salary, department_id)
VALUES (107, 'McMan',TO_DATE ('15-JAN-2013','ADMIN',13200,30);

SAVEPOINT McMan;

データ入力が完了すると、現在のセッションでCOMMITを発行して、トランザクション全体をコミットできます。

一貫性を読む

Oracleは、データアクセスおよび読み取り/書き込みアクションに関して、各セッションのユーザー間の一貫性を維持します。

テーブルでDMLが発生すると、アクションによって変更された元のデータ値がデータベースの取り消しレコードに記録されます。トランザクションがデータベースにコミットされていない限り、後で変更されたデータをクエリする他のセッションのユーザーは、元のデータ値を表示します。Oracleは、システムグローバル領域の現在の情報とUNDOレコードの情報を使用して、クエリ用のテーブルのデータの読み取り整合性のあるビューを構築します。トランザクションがコミットされた場合にのみ、トランザクションの変更が永続的になります。このトランザクションは、読み取りの一貫性を提供するためのOracleの戦略の鍵です。

読み取り一貫性のあるビューの開始点は、読者に代わって生成されます

変更されたデータが、読み取りまたは更新のためにデータベースの他のトランザクションによって表示されるタイミングを制御します