使用集合错误更新数据但可以插入

时间:2014-05-22 07:29:56

标签: oracle plsql

create or replace function get_ware_house_branch(p_WAREHOUSE_IDS  in varchar2,
 p_PLACE_ID       in varchar2)
  return id_warehouse_list                     
 is
   l_warehouse_list id_warehouse_list := id_warehouse_list();
  str varchar2(300);

begin

  str := 'SELECT BRANCH_WAREHOUSE(w.wh_id, w.wh_name)
              FROM POD_WAREHOUSE_MASTER W
              where ( W.wh_id  IN  (' ||p_WAREHOUSE_IDS  || '))';

  execute immediate str bulk collect into l_warehouse_list;

  for i in l_warehouse_list.first..l_warehouse_list.last loop 
      dbms_output.put_line(l_warehouse_list(i).wh_id || ', ' ||  l_warehouse_list(i).wh_name);


/*update pod_place_warehouse_mapping_tb 

 set wh_id = l_warehouse_list(i).wh_id 

 where place_id =  p_PLACE_ID ;*/


insert into pod_place_warehouse_mapping_tb (id,place_id ,wh_id )
    values
 (POD_UNIQUE_VAL_SEQ.NEXTVAL    ,p_PLACE_ID,l_warehouse_list(i).wh_id);

end loop;

commit;
 return l_warehouse_list;
end;

1 个答案:

答案 0 :(得分:0)

您看到的结果正是您想要执行的注释掉的UPDATE语句。在更新的情况下,您可以使用单个更新语句替换循环:

UPDATE POD_PLACE_WAREHOUSE_MAPPING_TB
  SET WH_ID = l_warehouse_list(l_warehouse_list.LAST).WH_ID
  WHERE PLACE_ID = p_PLACE_ID

上面的循环和UPDATE语句将产生完全相同的结果。在循环的情况下,您将使用l_warehouse_list中的每个值一个接一个地更新POD_PLACE_WAREHOUSE_MAPPING_TB中的所有行。当循环完成时,POD_PLACE_WAREHOUSE_MAPPING_TB中具有PLACE_ID = p_PLACE_ID的所有行都将其WH_ID列设置为来自具有最高索引的l_warehouse_list元素的WH_ID值。

我不知道你期待的其他结果。我认为你需要重新考虑一下你在做什么。

祝你好运。