Sql-certificate-manipulating-data

提供:Dev Guides
移動先:案内検索

操作データの使用

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

論理SQLトランザクションには3つのタイプのDMLステートメント、つまり挿入、更新、削除、およびマージがあります。トランザクションは、データベースセッション内のDMLアクションの論理的なコレクションです。

INSERTステートメント

INSERTコマンドは、テーブルにデータを保存するために使用されます。 INSERTコマンドは、Visual Basic.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形式で提供できますが、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 = expressionは、指定された列名のデータを更新する文字、式、または関数の任意の組み合わせにすることができます。WHERE句はオプションですが、含まれている場合は、更新する行を指定します。 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 [テーブル名]とDELETE FROM [テーブル名]は同じ意味を持ちます。

条件付き削除ステートメントの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は、トランザクションを明示的に終了する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の戦略の鍵です。

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

読み取りまたは更新のために、データベースの他のトランザクションが変更されたデータをいつ見ることができるかを制御します