0

如果我用游标引用整个表。是否可以多次使用基于其他表条件的insert语句?例如:

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

您可以打开游标、从游标中获取、关闭游标,然后稍后重新打开它。再次打开游标时可能会得到不同的数据,因为基础表中的数据可能已更改。但是,查看您的代码,似乎不需要首先声明游标——您可以简单地编写两条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 回答