具有已定义函数的oracle update table字段不起作用

时间:2014-10-22 14:40:36

标签: sql oracle

我感到困惑。我需要用“fips”更新表格。基于' zip'的信息码。我创建了以下oracle函数:

create or replace function fnc_get_rebid_by_zip
(
  p_zip in varchar2  
) return number as 
returnit number;
begin
      select c.id into returnit from zip_to_fips_map zfm
      left join sales_regions sr on zfm.county_fips = sr.fips
      left join customers c on sr.ind_user_id = c.das_emplid
      where zfm.zip_code = substr(p_ZIP,1,5);
      RETURN returnit;

      EXCEPTION
      WHEN NO_DATA_FOUND
          THEN return 0;
      WHEN OTHERS
          THEN return 0;

end fnc_get_rebid_by_zip;

我运行了以下更新sql语句。

update customers c
set rep_id = fnc_get_rebid_by_zip(c.zip) 

它不会更新rep_id。不应该吗?

该功能本身似乎正常工作。我跑:

select customers.id, fnc_get_rebid_by_zip(zip) newrepid, 
    customers.rep_id, customers.zip from customers

我得到以下内容。我相信' EXCEPTION NO_DATA ......'如果没有找到,则应该返回0,它会出现。

        ID   NEWREPID     REP_ID ZIP      
---------- ---------- ---------- ----------
       100        134          0 46240      
       102        134          0 46250      
       110        135          0 52325      
       113          0          0 12365      
       140          0          0 11111      
       141          0          0 99999      
       109        127          0 12345      
       105        127          0 12345-1234 
       106        134          0 46256      
       138          0          0 12312      
       111        134          0 46038      
       112        134          0 46235      
       118        127          0 12345      
       107          0          0 12314      
       115        127          0 12345      
       117        134          0 46240-1226 
       119          0          0 12365      
       139          0          0 12352      
       114          0          0 12312      
       142        134          0 46038      
       116          0          0 88888

对于后代:以下脚本可以解决问题:

merge into customers c
using (select zfm.zip_code, c.id client_id
         from zip_to_fips_map zfm
         left join sales_regions sr on zfm.county_fips = sr.fips
         left join customers c on sr.ind_user_id = c.das_emplid) upd
  on (upd.zip_code = substr(c.zip,1,5))
when matched then update
set c.rep_id = upd.client_id;

2 个答案:

答案 0 :(得分:1)

你真的需要功能吗?您可以将MERGE语句用于此更新操作。这是更好的方式:

merge customers c
using (select zfm.zip_code, c.id client_id
         from zip_to_fips_map zfm
         left join sales_regions sr on zfm.county_fips = sr.fips
         left join customers c on sr.ind_user_id = c.das_emplid) upd
  on (zfm.zip_code = c.zip)
when matched then update
set c.rep_id = upd.client_id;

我不确定这是您需要的确切查询,但您可以更改它。

你也应该这样查询:

select *
  from customers c full join
      (select zfm.zip_code, c.id client_id
         from zip_to_fips_map zfm
              left join sales_regions sr on zfm.county_fips = sr.fips
              left join customers c on sr.ind_user_id = c.das_emplid) upd
      on (zfm.zip_code = c.zip)

定义没有更新行的原因。可能是函数中的查询返回0行,或者它返回的值与您已有的值相同。

答案 1 :(得分:0)

在函数中选择可能会返回NULL。也许你需要这样的东西:

  select nvl(c.id, 0) into returnit from zip_to_fips_map zfm
  left join sales_regions sr on zfm.county_fips = sr.fips
  left join customers c on sr.ind_user_id = c.das_emplid
  where zfm.zip_code = substr(p_ZIP,1,5);
  RETURN returnit;