0

カーソルでテーブル全体を参照している場合。他のテーブルの条件に基づく挿入ステートメントを複数回使用できますか? 例えば:

V_Name                 Emp.Name%type;
V_E_Number             Emp.Number%type;
V_Location             Emp.Location%type;
V_City                 Emp.City%type;
V_P_ID                 Emp.P_ID%type;
V_State_Code           Emp.State_Code%type;

Cursor C1 is Select emp.name, emp.number, emp.Location, emp.City, emp.P_ID, emp.State_Code
             From Employee Emp, Former_Employee Femp
             Where Emp.Number = Femp.Number
             And State_Code = '4';

Begin

Open C1;

Loop

Fetch C1 Into V_Name, V_E_Number, V_Location, V_City, V_P_ID, V_State_Code;

EXIT WHEN C1%NOTFOUND;

IF New_Emp.P_ID != V_P_ID 
Then Insert Into New_Emp
Values (V_Name, V_E_Number, V_Location, V_City, V_P_ID, V_State_Code); 

IF New_Emp.P_ID = V_P_ID,
   New_Emp.State_Code = V_State_Code
Then Insert Into Emp_Archive
VALUES (V_Name, V_E_Number, V_Location, V_City, V_P_ID, V_State_Code);  

Else Do Nothing;

End If;

End Loop;

Close C1;

End;
/ 

次に、カーソルを再度開いて、別の If ステートメントを使用して、別のテーブルに別の条件を入力することはできますか?

4

1 に答える 1

1

カーソルを開き、カーソルからフェッチし、カーソルを閉じて、後で再度開くことができます。基になるテーブルのデータが変更されている可能性があるため、カーソルを再度開いたときに異なるデータが表示される場合があります。ただし、コードを見ると、そもそもカーソルを宣言する必要はないようです.2つのステートメントをコーディングするだけで済みます(コードが参照しているが宣言していないレコードが有効であるとINSERT仮定します)。new_emp

INSERT INTO new_emp
  Select emp.name, emp.number, emp.Location, emp.City, emp.P_ID, emp.State_Code
    From Employee Emp, Former_Employee Femp
    Where Emp.Number = Femp.Number
      And State_Code = '4'
      AND emp.p_id   = new_emp.p_id;

INSERT INTO Emp_Archive
  Select emp.name, emp.number, emp.Location, emp.City, emp.P_ID, emp.State_Code
    From Employee Emp, Former_Employee Femp
    Where Emp.Number = Femp.Number
      And State_Code = '4'
      AND emp.p_id   = new_emp.p_id
      AND emp.state_code = new_emp.state_code;

単一の INSERT ALL を実行することで、それをさらに簡素化できます

INSERT ALL 
  WHEN new_emp.p_id = p_id
       THEN INTO new_emp( name, number, location, city, p_id, state_code )
              VALUES( name, number, location, city, p_id, state_code )
  WHEN new_emp.p_id = p_id AND
       new_emp.state_code = state_code
       THEN INTO emp_archive( name, number, location, city, p_id, state_code )
              VALUES( name, number, location, city, p_id, state_code )
  Select emp.name, emp.number, emp.Location, emp.City, emp.P_ID, emp.State_Code
    From Employee Emp, Former_Employee Femp
    Where Emp.Number = Femp.Number
      And State_Code = '4'  
于 2012-05-04T01:08:47.073 に答える