2013-05-17 11 views
0

我想創建兩個表使用相同的記錄,兩個不同的名稱,但它只創建其中任何一個或有時會引發異常。不能創建兩個具有不同名稱和使用單個記錄的表,我該如何實現這一點?

以下是從我的記錄文件中的代碼:

-record(account,{acctnum, cnic, name, address,date ,time, balance=0}). 

以下是從模塊調用帳戶我的代碼:

-module(accounts). 
-compile(export_all). 
-include("records.hrl"). 
start()-> 
ets:new(current,[named_table,{keypos, #account.cnic}]), 
ets:new(savings,[named_table,{keypos, #account.cnic}]). 

有時它返回稱爲儲蓄的原子,但有時它提供了以下錯誤:

**異常錯誤:錯誤的參數 in函數ets:new/2 被稱爲ets:new (current,[named_table,{keypos,3}]) 來自帳戶的呼叫:start/0(accounts.erl,line 5)

請確認我是否可以在ets中創建兩個表單一記錄? 如果沒有,那麼我該如何實現它,我試圖創建兩個表,一個用於儲蓄賬戶和其他賬戶,我該如何解決這個問題?

+0

這是因爲@Pascal和@AlexeyKachayev說:你不能創建超過** ONE **名稱相同的表格。如果它是一個「私人」表,那麼每個進程不超過一個,否則總共不超過一個。它與記錄名無關,因爲表元組的內容僅僅是數據。 – rvirding

+0

作爲ETS表格中的元組僅僅是數據的例子,它們甚至不必是相同的大小!只要元素足夠大以包含密鑰,就可以擁有不同數量元素的元組。他們不認爲任何東西給ETS,因此如果他們都有相同的第一個元素,ETS不關心,它只關心密鑰。 – rvirding

回答

1

根據一條記錄創建兩個ETS沒有問題。

** exception error: bad argument 
    in function ets:new/2 
     called as ets:new(current,[named_table,{keypos,3}]) 
    in call from accounts:start/0 (accounts.erl, line 5) 

這樣的異常通常意味着已經創建了具有相同名稱的表。即函數start被調用兩次(第一次成功,第二次 - 不)。

0

當你第一次執行啓動時,一切正常,並且你得到的結果是函數的最後一行。您可以使用電視模塊進行檢查;執行電視:開始(),你可以檢查任何ets或mnesia表。 如果您再次執行開始,那麼正如Alexey所說,由於表格當前(和保存)已經存在,您將會看到一個錯誤。這會造成殼體崩潰,並摧毀2個表格;所以下一次你會使用start,它會再次OK。

如果你不知道,如果ETS表已經存在,你可以用這樣的代碼進行測試:

ensure(T,Def) -> 
    case ets:info(T) of 
     undefined -> ets:new(T,Def); 
     _ -> ets:delete_all_objects(T) %% or anything you need to do in this case 
    end. 
相關問題