![](/img/trans.png)
[英]Loop through select query results from a table and Update column in same table
[英]Update a Table with results of a Query
我想在我的一個表上更新一個新列,但我不確定如何解決這個問題。
新列為MARITAL_STATUS,位於SCV_CLEINT_DETAILS表中。 此表的值將從各種來源生成,下面的查詢將獲取我正在尋找的值:
SELECT scd.qsclient_id,
scd.system_client_id,
NVL(c.paxus_client_id, c.client_id),
UPPER(NVL(NVL2(c.paxus_client_id, pc.clt_mar_stat, c.maritial_status_code), decode(c.client_type_id, '2000001702', 'C', 'U'))) AS NewMarStatus,
scd.marital_status
FROM scv_client_details scd, client c, paxus_client pc
WHERE scd.system_client_id = to_char(c.client_id)
AND c.paxus_client_id = pc.client(+)
AND UPPER(scd.SYSTEM_INDICATOR) = 'WRITEN'
AND (scd.marital_status <> UPPER(NVL(NVL2(c.paxus_client_id, pc.clt_mar_stat, c.maritial_status_code), decode(c.client_type_id, '2000001702', 'C', 'U'))) OR
scd.marital_status IS NULL)
我想用上面NewMarStatus中生成的值更新新的MARITAL_STATUS列。 我真的不知道如何寫更新語句。
任何幫助真的很感激。
我總是使用批量上傳程序來處理這些事情。
declare
cursor cur
is
SELECT scd.rowid row_id,
UPPER(NVL(NVL2(c.paxus_client_id, pc.clt_mar_stat, c.maritial_status_code), decode(c.client_type_id, '2000001702', 'C', 'U'))) AS marital_status
FROM scv_client_details scd, client c, paxus_client pc
WHERE scd.system_client_id = to_char(c.client_id)
AND c.paxus_client_id = pc.client(+)
AND UPPER(scd.SYSTEM_INDICATOR) = 'WRITEN'
AND (scd.marital_status <> UPPER(NVL(NVL2(c.paxus_client_id, pc.clt_mar_stat, c.maritial_status_code), decode(c.client_type_id, '2000001702', 'C', 'U'))) OR
scd.marital_status IS NULL)
order by row_id
;
type type_rowid_array is table of rowid index by binary_integer;
type type_marital_status_array is table of scv_client_details.marital_status%type;
arr_rowid type_rowid_array;
arr_marital_status type_marital_status_array;
begin
open cur;
loop
fetch cur bulk collect into arr_rowid, arr_marital_status;
forall i in arr_rowid.first .. arr_rowid.last
update scv_client_details tab
SET tab.marital_status = arr_marital_status(i)
where tab.rowid = arr_rowid(i)
;
exit when cur%notfound;
end loop;
close cur;
commit;
exception
when others
then rollback;
raise_application_error(-20000, 'Fout bij uitvoeren update van scv_client_details(marital_status) - '||sqlerrm);
end;
在其他SO中描述了幾種更新連接的方法:
MERGE
是進行批量連接更新的最簡單方法之一。 它可以很好地擴展,因為它可以使用所有形式的連接,尤其是HASH JOIN。
USING
子句是您的查詢(顯然添加了rowid
):
MERGE INTO scv_client_details d
USING (SELECT NVL(c.paxus_client_id, c.client_id),
UPPER(NVL(NVL2(c.paxus_client_id,
pc.clt_mar_stat,
c.maritial_status_code),
decode(c.client_type_id, '2000001702', 'C', 'U')))
AS NewMarStatus,
scd.ROWID rid
FROM scv_client_details scd, client c, paxus_client pc
WHERE scd.system_client_id = to_char(c.client_id)
AND c.paxus_client_id = pc.client(+)
AND (scd.marital_status <>
UPPER(NVL(NVL2(c.paxus_client_id,
pc.clt_mar_stat,
c.maritial_status_code),
decode(c.client_type_id, '2000001702', 'C', 'U')))
OR
scd.marital_status IS NULL)) v
ON (d.ROWID = v.rid)
WHEN MATCHED THEN
UPDATE SET d.marital_status = newmarstatus;
有關完整示例,請參閱此SQLFiddle 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.