資料重覆比對 |
尚未結案
|
smallmi
一般會員 ![]() ![]() 發表:18 回覆:18 積分:7 註冊:2012-09-02 發送簡訊給我 |
請問各位版大...有什麼方式可以達到以下效果...請各位版大指導...謝謝!!
讀取文字檔並存入資料庫...但是再存入資料庫前先比對資料庫是否有重覆的值 如有的話...則該筆資料不存入... 例如....文字檔中檔案內容如下 2013081900 2013081901 2013081902 2013081903 假如資料庫中已有2013081902...該筆資料不存入...存2013081900,2013081901,2013081903這三筆資料 目前已將文字檔讀取並存入資料庫...但不知該用什麼方法作比對...比較有效率 請各位版大指導...謝謝!! |
老大仔
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:78 回覆:837 積分:1088 註冊:2006-07-06 發送簡訊給我 |
最基本的方式...
存入前去Select資料庫是不是有那筆資料 沒有的話就新增 另解... 先一口氣把資料庫裡的資料全都Select出來到DataSet中 然後讀進文字檔後 逐一與DataSet筆對 可用Lookup或locate都行 沒有的話就新增 這樣也行 詳細用法請自行查相關資料 ===================引 用 smallmi 文 章=================== 請問各位版大...有什麼方式可以達到以下效果...請各位版大指導...謝謝!! 讀取文字檔並存入資料庫...但是再存入資料庫前先比對資料庫是否有重覆的值 如有的話...則該筆資料不存入... 例如....文字檔中檔案內容如下 2013081900 2013081901 2013081902 2013081903 假如資料庫中已有2013081902...該筆資料不存入...存2013081900,2013081901,2013081903這三筆資料 目前已將文字檔讀取並存入資料庫...但不知該用什麼方法作比對...比較有效率 請各位版大指導...謝謝!!
編輯記錄
老大仔 重新編輯於 2013-08-20 07:29:21, 註解 無‧
|
herbert2
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
|
tuga
高階會員 ![]() ![]() ![]() ![]() 發表:16 回覆:109 積分:120 註冊:2002-07-13 發送簡訊給我 |
|
smallmi
一般會員 ![]() ![]() 發表:18 回覆:18 積分:7 註冊:2012-09-02 發送簡訊給我 |
|
herbert2
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
|
smallmi
一般會員 ![]() ![]() 發表:18 回覆:18 積分:7 註冊:2012-09-02 發送簡訊給我 |
|
herbert2
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
|
smallmi
一般會員 ![]() ![]() 發表:18 回覆:18 積分:7 註冊:2012-09-02 發送簡訊給我 |
主KEY新增的問題..我的主EKY規則是當天日期 四碼流水號..隔天的話..四碼流水號重新計算
請版大指導..謝謝!! [code sql] CREATE OR REPLACE FUNCTION GetSerialNo RETURN VARCHAR2 IS v_DateStr VARCHAR2(10); --系統日期對應的字串 v_SerialNum NUMBER(4); --流水序號 BEGIN --取系統日期生成需要的字串 v_DateStr := TO_CHAR(SYSDATE, ('YYYYMMDD')); --生成產生流水號的序號 BEGIN SELECT Decode(num_rtnm, v_DateStr, (num_ps 1), 1) INTO v_SerialNum FROM AAA FOR UPDATE; EXCEPTION WHEN NO_DATA_FOUND THEN v_SerialNum := 1; INSERT INTO AAA (num_rtnm, num_ps) VALUES (v_DateStr, v_SerialNum); END; --修改流水號參數 UPDATE AAA SET num_rtnm = v_DateStr, num_ps = v_SerialNum; COMMIT; --得到需要的流水號 RETURN v_DateStr || Lpad(v_SerialNum, 4, '0'); EXCEPTION WHEN OTHERS THEN ROLLBACK; RETURN NULL; END;[/code] |
herbert2
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
請問您用 Delphi 幾版,Oracle 幾版?
Function 是給 Oracle 的 Package 或 Procedure 呼叫的,前端 Delphi 應無法呼叫。 您應改寫成 Procedure,讓 Delphi 的 TStoredProc 執行 Open(), 並以 OPEN Cursor 的方式傳回 TStoredProc 讀取該 Cursor 該 Field 的值。 其實您這架構仍有問題,若多台 PC 同時在 Insert 資料,在 A 台獲得 'dd0001' 而尚未 Post() 時, B、C、D.... 台可能也得到 'dd0001',若 C 台先 Post(),A、B、D.... 台都 Post() 不進去了。 若是單機作業則無妨,否則您應詳加考慮是否要用 Trigger 來處理。
編輯記錄
herbert2 重新編輯於 2013-09-04 14:58:13, 註解 無‧
|
herbert2
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
又,您用 'ddnnnn' 當 Primary Key 雖然可以,
但若 User 控管不佳,同一筆文件資料,Key-in 多次, 會得到 dd0001,A,B,C,.... 及 dd0002,A,B,C,.... 兩筆甚至多筆除了 Key 以外都相同的資料, 宜加用另一個 Unigue Index 防止或檢查, 否則可能發生一張訂單兩筆銷貨。一個員工兩筆人事資料(離職再新進又另當別論)等問題。
編輯記錄
herbert2 重新編輯於 2013-09-04 14:51:09, 註解 無‧
|
smallmi
一般會員 ![]() ![]() 發表:18 回覆:18 積分:7 註冊:2012-09-02 發送簡訊給我 |
感謝大大的協助...我使用一個procedure來產生"日期+流水號"...但遇到以下問題
同時在2台PC執行程式...會發生..."日期 流水號"重覆的情況... 例如:201308080001 AAA 201308080001 BBB 請問各位版大...有什麼方式可以防止取到重覆的編號 請版大指導...謝謝!! [code sql] create or replace procedure p_Get_SerialNo(retval out varchar2) as curDate char(8); curNo number(10); begin select to_char(sysdate, 'YYYYMMDD') into curDate from dual; select nvl(max(num_ps), 0) 1 into curNo from AAA where num_rtnm = to_date(curDate,'YYYYMMDD') for update; if (curNo = 1) then insert into AAA (num_rtnm, num_ps) values (to_date(curDate,'YYYYMMDD'), 1); else update AAA set num_ps = curNo where num_rtnm = to_date(curDate,'YYYYMMDD'); end if; retval := curDate || lpad(to_char(curNo), 8, '0'); commit; EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20199, '??'); END; [/code]
編輯記錄
smallmi 重新編輯於 2013-09-26 22:25:15, 註解 無‧
smallmi 重新編輯於 2013-09-26 22:26:36, 註解 無‧ smallmi 重新編輯於 2013-09-26 22:28:11, 註解 無‧ smallmi 重新編輯於 2013-09-26 22:29:45, 註解 無‧ smallmi 重新編輯於 2013-09-26 22:30:34, 註解 無‧ smallmi 重新編輯於 2013-09-26 22:33:27, 註解 無‧ smallmi 重新編輯於 2013-09-26 22:34:22, 註解 無‧ smallmi 重新編輯於 2013-09-26 22:35:20, 註解 無‧ smallmi 重新編輯於 2013-09-26 22:36:25, 註解 無‧ |
herbert2
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
唉!我在 09/04 #10 不就提醒您多台同時 Insert 會發生這種事嗎?
請問,您的 Primary Index Key 或及 Unique Index Key 到底為何? 一個 Table 是可以有多個 Index 的,難道您未建立 "日期 流水號" 的 Unique Index 嗎? 若您有建立 "日期 流水號" 的 Unique Index,較晚 Post 者便無法 Post; 若您未建立 "日期 流水號" 的 Unique Index,較晚 Post 者便仍可 Post,於是就發生您這種狀況了! 當 User 新增時,您於他 Key-In 日期後就呼叫 StoredProc 給他新的流水號, 然後他 Key-In 其他欄位資料,又接個電話,別人搞不好都已 Key-In 新增好多筆了, 當然會發生您這種冏事啊! 即使您於 BeforePost() 再重抓一次流水號,Post 時差個幾毫秒,您仍是無法避免這個錯誤的。 故一定要建立 "日期 流水號" 的 Unique Index 去擋這個錯誤! 您這才兩台在 Key-In 呢,若是台鐵、高鐵、演唱會...的售票,數千台同時湧入,像您這種疏忽, 不被罵得臭頭才怪! 很多事情自己推敲一下就知道,不一定要等跌倒才知道會痛吧! 依我猜想,您可能還漏考慮多台 PC 短時間內同時去修改或刪除同一筆資料、日期打錯要改日期...等問題吧! 最好的老師是 User,別忘了,子曰:「吾不如老圃!」
編輯記錄
herbert2 重新編輯於 2013-09-26 23:18:31, 註解 無‧
|
it1506
初階會員 ![]() ![]() 發表:32 回覆:89 積分:49 註冊:2011-02-16 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |