0

レコードが従業員テーブル (新しい従業員) に挿入されると、トリガーが起動し、レコードを employee_dept_history テーブルに「N/A」として挿入するトリガーを作成しようとしています (この従業員は新しい従業員であるため)前科なし)。また、現在の従業員が部門を変更した場合、トリガーは employee_dept_history テーブルにレコードを挿入し、従業員の depatment_id が変更されます。このトリガーの作成に問題があります。誰かが私のコードを正しい方向に導くことができるかどうか疑問に思っていました。以下のトリガーで「N/A」を表示できません。このトリガーを機能させるにはどうすればよいですか? 新しい部門と古い部門のローカル変数を作成する必要がありますか?

CREATE OR REPLACE TRIGGER employee_dept_trigger
   BEFORE INSERT OR UPDATE ON employee
   FOR EACH ROW

BEGIN
   INSERT INTO employee_dept_history
   VALUES(:NEW.employee_id, 
       :NEW.employee_name, 
        from_department_name (NEEDS TO OUTPUT 'N/A'),
        to_department_name, 
        sysdate);
 END employee_dept_trigger;

EMPLOYEE_DEPT_HISTORY テーブルは次のようになります。

CREATE TABLE empployee_dept_history
(
    EMPLOYEE_ID NUMBER(4)
    EMPLOYEE_NAME VARCHAR2(50)
    FROM_DEPARTMENT_NAME VARCHAR2(50)
    TO_DEPARTMENT_NAME VARCHAR2(50)
    OPERATION_TIME DATE
);

EMPLOYEE テーブル:

(
    EMPLOYEE_ID NUMBER(4)
    EMPLOYEE_NAME VARCHAR2(20)
    JOB VARCHAR2(50)
    MANAGER_ID NUMBER(4)
    HIRE_DATE DATE
    SALARY NUMBER(9)
    COMMISION NUMBER(9)
    DEPARTMENT_ID NUMBER(4)
);
4

3 に答える 3

2

注:この回答は他の2つと似ていますが、トリガーを別の方法で定義しているため、役立つ可能性があるため、とにかく投稿します。他の2つの回答はうまく機能するため、賛成票を投じたことに注意してください。

まず、列の変更のみに関心がある場合はDEPARTMENT_ID、トリガー定義でそれを指定できます。

CREATE OR REPLACE TRIGGER employee_dept_trigger
   BEFORE INSERT OR UPDATE OF department_id ON employee
   FOR EACH ROW
....

トリガーは、「自動」論理値INSERTINGを使用しUPDATINGて、挿入または更新によって呼び出されたかどうかを判断できます。INSERTINGこの値を使用して、これが新しい従業員であることを示すことができます。

IF INSERTING THEN
   -- set old department name = 'N/A'
ELSE
   -- set old department name = whatever
END IF;

あなたの質問は部門名の由来を説明していないため、部門名に関しては、この例は疑似コードになります。

CREATE OR REPLACE TRIGGER employee_dept_trigger
   BEFORE INSERT OR UPDATE OF department_id ON employee
   FOR EACH ROW
BEGIN
  IF INSERTING THEN
    -- New employee
    INSERT INTO employee_dept_history VALUES (
       :NEW.employee_id,
       :NEW.employee_name,
       'N/A',
       (SELECT department_name from ...), <-- based on :NEW.department_id
       SYSDATE);
  ELSE
    -- Existing employee
    INSERT INTO employee_dept_history VALUES (
       :NEW.employee_id,
       :NEW.employee_name,
       (SELECT department_name from ...), <-- based on :OLD.department_id
       (SELECT department_name from ...), <-- based on :NEW.department_id
       SYSDATE);
  END IF;
END employee_dept_trigger;
于 2013-06-06T18:42:20.883 に答える
1

どちらかです

CREATE OR REPLACE TRIGGER employee_dept_trigger
   BEFORE INSERT OR UPDATE ON employee
   FOR EACH ROW
DECLARE
  from_department_name varchar(255);
  to_department_name varchar(255);
BEGIN
   select from DEPARTMENT where DEPARTMENT_ID=:NEW.DEPARTMENT_ID into to_department_name;
   IF INSERTING THEN
   INSERT INTO employee_dept_history
   VALUES(:NEW.employee_id, 
       :NEW.employee_name, 
        'N/A',
        to_department_name, 
        sysdate);
   end if;
   IF UPDATING THEN
   select from DEPARTMENT where DEPARTMENT_ID=:OLD.DEPARTMENT_ID into from_department_name;
   INSERT INTO employee_dept_history
   VALUES(:NEW.employee_id, 
        :NEW.employee_name, 
        from_department_name ,
        to_department_name, 
        sysdate);
   end if;
 END employee_dept_trig;

または私はあなたの質問を理解していません。

于 2013-06-06T18:30:41.213 に答える