我想更新一個包含PHONE_NUMBER和COUNTRY列的表(T_NUMBERS)。 COUNTY COL爲空(全爲NULL),電話號碼不唯一,其格式爲:「420575757111」(以國家代碼開頭,不帶+或00)。國際呼叫代碼存儲在另一個表(INT_CODES)中,兩列:INT_CODE,COUNTRY。看起來像這樣:識別PL/SQL迭代中的電話號碼
COUNTRY || INT_CODE
-------------------------
USA/CANADA || 1
RUSSIA || 7
EGYPT || 20
GREECE || 30
BELGIUM || 32
FRANCE || 33
HUNGARY || 36
COLOMBIA || 57
KENYA || 254
IRELAND || 353
GRENADA || 1473
等等。
我的理念是創建一個腳本,在工作方式如下:
在第一輪第4位數字的電話號碼進行比較,以INT_CODE和更新INT_CODES的T_NUMBERS.COUNTRY領域。 COUNTRY它創立匹配,這樣的:
INT_CODES.INT_CODE = SUBSTR(T_NUMBERS.PHONE_NUMBER,1,4)
之後第二輪比較第一3位數字,其中T_NUMBERS.COUNTRY仍然是NULL。
在接下來的兩輪中,以相同的方式檢查2位和1位代碼,以填充所有國家字段,但不覆蓋已填充的字段。
我的問題是我不能運行這將至少執行第一步,因爲甲骨文似乎不支持在UPDATE語句中加入一個單一的腳本,你可以在這裏閱讀,例如:
Update statement with inner join on Oracle
,我試圖從答案的解決方案,但它不工作:
SQL錯誤:ORA-01427:單行子查詢返回不止一行
後,我試圖此(只有第一輪):
begin
for t_rows in c_code
loop
update (select TN.COUNTRY as C_OLD, IC.COUNTRY as C_NEW from T_NUMBERS TN
left join INT_CODES IC on IC.INT_CODE = substr(TN.PHONE_NUMBER,1,4) where
TN.COUNTRY IS NULL) T_TAB
set TAB.C_OLD = TAB.C_NEW;
close c_code;
end loop;
錯誤消息: ORA-06512:在第8行 01779. 00000 - 「不能修改它映射到非一列鍵保存表「
所以我的主要問題是:什麼聲明我應該插入到循環? 我的問題:是否有任何其他解決方案來產生相同的結果(不創建更多的表格或修改現有的結構)?
在此先感謝。
在San的答案下看到我的反應。謝謝! – A117
謝謝。我會更新答案以反映這個問題。 – Nagh