使用光标引用整个表然后根据条件插入

时间:2012-05-04 00:57:20

标签: oracle if-statement plsql cursor

如果我用光标引用整个表。我可以多次使用基于其他表中条件的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语句来填充具有不同条件的其他表吗?

1 个答案:

答案 0 :(得分: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'