2017-07-31 2 views
0

私は3つの列を持つテーブルがあるとしましょう。シリアルID、従業員名、および従業員給与。データがこのテーブルに挿入されるたびに、シリアルID列は1,2,3,4などのように増分されます。次の部分は、データが削除されるたびに、シリアルIDの値全体が調整されます。行の削除は、開始行、最後の行、またはテーブル内の任意の場所で実行できます。これをPL/SQLを介してどのように行うのでしょうか。シリアル番号を更新しています。データの挿入とデータの削除のイベントのテーブルで

+0

「シリアルIDの値全体が調整される」とはどういう意味ですか?サンプルデータを詳しく説明してください。 –

+0

シーケンスから生成された実際のID値を持つ追加の列を1つ追加することをお勧めします(これは、その列にあるインデックスやPK制約に適しています)。次に、テーブルにレコードを挿入するプロシージャ、またはトリガ(挿入、更新、削除トリガーの前)のいずれかで、好きなように列を調整してからOracleがコミットします(この場合もちろんコードで)。 – g00dy

+0

@KaushikNayak。 "シリアルIDの値全体が調整されます"とは、テーブルに10行あり、シリアルIDが1から10まで作成されたと仮定します。最後の行が削除された場合(これは簡単な部分です)シリアルID最初の行が削除された場合、2番目の行はシリアルID = 1、3番目の行はシリアルID = 2などとなります。 5行目が削除された場合、最初の4行は変更されずに6行目はシリアルID = 5、7行目はシリアルID = 6となります。このイベントは、削除が発生するたびに自動的に発生する必要があります。 – tapabrata

答えて

0

これは、以下の手順で行うことができますが、テーブルから直接削除することはできません。代わりに、同じ構造のビューから削除して、代わりのトリガを使用して親テーブルを更新することができます。また、従業員テーブルからIDを削除するので、その従業員を一意に識別する少なくとも1つの他のキーが存在する必要があります。すべてのこれらの前駆体を考慮して、ここに手順があります。

UNIQUE KEYを作成すると、employee_nameになります。 employee_nameが表全体で常に一意であることを確認できる場合は、この手順は必須ではありません。しかし、従業員の記録がわからない場合、それを特定する方法はありません。

ALTER TABLE emp ADD CONSTRAINT emp_uk UNIQUE(employee_name); 

次へempテーブルと同じ定義を持つビューを作成します。

CREATE OR REPLACE VIEW emp_view AS 
SELECT * FROM EMP; 

行方向選択クエリがRANK()機能を使用して再計算emp_idをフェッチしているとmerge文はEMPを更新しているここでの操作ビューに emp_view

CREATE OR REPLACE TRIGGER trigg_emp_v INSTEAD OF 
    DELETE ON emp_view FOR EACH ROW 
BEGIN 
    DELETE 
    FROM EMP 
    WHERE emp_id = :OLD.emp_id ; 
    MERGE INTO EMP e USING 
    (SELECT RANK() OVER (ORDER BY emp_id) emp_id, 
    employee_name, 
    salary 
    FROM 
    (SELECT * FROM emp WHERE emp_id != :OLD.emp_id 
    ) 
) v ON (e.employee_name = v.employee_name) 
WHEN MATCHED THEN 
    UPDATE SET e.emp_id = v.emp_id; 
END; 
/

を削除するためのINSTEAD OF TRIGGERを作成します。表。削除後ID = 5

Before Deletion 

    SELECT * FROM EMP; 

    EMP_ID EMPLOYEE_NAME        SALARY 
---------- ---------------------------------------- ---------- 
     1 EMPLOYEE_1          1001 
     2 EMPLOYEE_2          1002 
     3 EMPLOYEE_3          1003 
     4 EMPLOYEE_4          1004 
     5 EMPLOYEE_5          1005 
     6 EMPLOYEE_6          1006 
     7 EMPLOYEE_7          1007 
     8 EMPLOYEE_8          1008 
     9 EMPLOYEE_9          1009 
     10 EMPLOYEE_10         1010 
-------------------------------------------------------------------- 

削除操作

DELETE FROM EMP_VIEW where emp_id = 5; 

ため

テスト、出力は次のようなものです。

SELECT * FROM EMP; 
    EMP_ID EMPLOYEE_NAME        SALARY 
---------- ---------------------------------------- ---------- 
     1 EMPLOYEE_1          1001 
     2 EMPLOYEE_2          1002 
     3 EMPLOYEE_3          1003 
     4 EMPLOYEE_4          1004 
     5 EMPLOYEE_6          1006 
     6 EMPLOYEE_7          1007 
     7 EMPLOYEE_8          1008 
     8 EMPLOYEE_9          1009 
     9 EMPLOYEE_10         1010 

あなたのフィードバックを教えてください。

関連する問題