今天寫這段(員工旅遊Day2,終於回到家)
update_result(v_tmp); --將結果更新到最後一次的猜測,供後續檢測用
腦袋一片空白。
先用pl/sql, 再抽空改成package
declare
v_tmp varchar2(30);
v_gsa varchar2 := substrb(v_tmp, 1, 1); --xA
v_gsb varchar2 := substrb(v_tmp, 2, 1); --xB
v_seq_id number;
begin
select max(seq_id) --取得最後的回合數
into v_seq_id
from yafuu_guess_history;
update yafuu_guess_history --將Player回復結果更新回資料庫
set gs0a = to_number(v_gsa),
gs0b = to_number(v_gsb)
where seq_id = v_seq_id;
end;
完成這部分,就只剩下主程式了,這裡還要用到陣列概念,先POST文,
漏掉一段
ELSE --Not yet finish, keep guess
V_MSG := GET_NEXT_GUESS; --Get Next Guess
這裡的一段SQL會去變更126組的樣本,其中不吻合資格者,update gs_flag = 0 means NG
以這個例子
(1)猜1234,結果是0A2B
(2)猜5678,結果是0A2B
(3)猜2187,結果是1A1B
(4)猜2845,結果是0A1B
(5)猜6417,結果是0A2B。
(6)猜7153,結果是4A0B。
當1234=2B時,去把126組裡面,重新比對過,如果A+B數字不同於2,則屬淘汰樣本。
所以會留下1278,1378,3489這類的樣本數60個。
declare
cursor c_his is
select seq_id, gs01, gs02, gs03, gs04
from yafuu_guess_array
where gs_flag = 1;
cursor d_samp is
select seq_id, gs01, gs02, gs03, gs04, gs0a, gs0b
from yafuu_guess_history
order by seq_i;
v_ga number;
v_gb number;
v_ab varcahr2(10); --紀錄篩選用
begin
--這裡的比對可以另一個函數?Translate,但沒空仔細研究了。
for sam in d_samp loop --所有有效樣本庫
for hist in c_his loop --拿樣本庫比對歷史紀錄,失敗者註銷樣本庫資格
--先計算A數量
if hist.gs01 = sam.gs01 then
v_ga := v_ga + 1;
end if;
if hist.gs02 = sam.gs02 then
v_ga := v_ga + 1;
end if;
if hist.gs03 = sam.gs03 then
v_ga := v_ga + 1;
end if;
if hist.gs04 = sam.gs04 then
v_ga := v_ga + 1;
end if;
--計算B數量
if hist.gs01 = sam.gs02 or hist.gs01 = sam.gs03 or hist.gs01 = sam.gs04 then
v_gb := v_gb + 1;
end if;
if hist.gs02 = sam.gs01 or hist.gs02 = sam.gs03 or hist.gs02 = sam.gs04 then
v_gb := v_gb + 1;
end if;
if hist.gs03 = sam.gs01 or hist.gs03 = sam.gs02 or hist.gs03 = sam.gs03 then
v_gb := v_gb + 1;
end if;
if hist.gs04 = sam.gs01 or hist.gs01 = sam.gs02 or hist.gs01 = sam.gs03 then
v_gb := v_gb + 1;
end if;
if to_number(v_ga) + to_number(v_gb) <> to_number(hist.ga01) + to_number(hist.ga01) then
v_ab = 'NG';
exit;
end if;
end loop;
if v_ab = 'NG' then --比對不出,已經喪失資格。
update yafuu_guess_array
set gs_flag = 0
where seq_id = sam.seq_id;
end if;
end loop;
--所有樣本庫全部有效
update yafuu_guess_array
set gs_flag = 1;