我感到困惑。我需要用“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;
答案 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;