2013-03-02 82 views
2

我是PHP和sql的新手,我正在構建一個小遊戲來學習更多後者。PL/SQL函數在檢查後從表中返回一個值

這是我的三個表的簡單數據庫:

-- *********** SIMPLE MONSTERS DATABASE 

CREATE TABLE monsters (

monster_id   VARCHAR(20), 
haunt_spawn_point VARCHAR(5) NOT NULL, 
monster_name  VARCHAR(30) NOT NULL, 
level_str   VARCHAR(10) NOT NULL, 
creation_date  DATE NOT NULL, 

CONSTRAINT monster_id_pk PRIMARY KEY (monster_id) 
); 

-- **************************************** 

CREATE TABLE spawntypes (

spawn_point   VARCHAR(5), 
special_tresures  VARCHAR (5) NOT NULL, 
maximum_monsters  NUMBER NOT NULL, 
unitary_experience  NUMBER NOT NULL, 

CONSTRAINT spawn_point_pk PRIMARY KEY (spawn_point) 
); 

-- **************************************** 

CREATE TABLE fights (

fight_id   NUMBER, 
my_monster_id  VARCHAR(20), 
foe_spawn_point VARCHAR(5), 
foe_monster_id  VARCHAR(20) NOT NULL, 
fight_start  TIMESTAMP NOT NULL, 
fight_end   TIMESTAMP NOT NULL, 
total_experience NUMBER NOT NULL 
loot_type   NUMBER NOT NULL, 

CONSTRAINT my_monster_id_fk FOREIGN KEY (my_monster_id) 
REFERENCES monsters (monster_id), 

CONSTRAINT foe_spawn_point_fk FOREIGN KEY (foe_spawn_point) 
REFERENCES spawntypes (spawn_point), 

CONSTRAINT fight_id_pk PRIMARY KEY (fight_id) 
); 

鑑於這個數據我怎麼能輕而易舉地進行兩個任務:

1)我想創建一個PL/SQL函數只傳遞一個fight_id作爲參數並給出foe_spawn_point(在戰鬥表內)返回與引用spawypes表的spaw點有關的unitary_experience,我該怎麼做? : -/[f(x)]

爲了計算從戰鬥中獲得的總體經驗(unitary_experience * fight_length),我創建了一個函數,給定一個特定的戰鬥將減去fight_end與fight_start,所以現在我知道戰鬥持續了多久。 [f(y)]

2)是否有可能在數據庫填充任務期間使用這兩個函數(將它們返回的結果相乘)?插入到戰鬥值(....,f(x)* f(y),'戰利品A');

爲了填充戰鬥表內的所有total_experience條目?

感謝你的幫助

回答

1

在SQL中,你通常不會談論建築的功能做的事情。 SQL的構建塊是查詢,視圖和存儲過程(大多數SQL語言都有功能,但這不是開始的地方)。

因此,考慮以$ FIGHTID一個變量,你會與使用join操作簡單查詢獲取酉經驗:

select unitary_experience 
from fight f join 
    spawnTypes st 
    on st.spawn_point = f.foe_spawn_point 
where fightid = $FIGHTID 

如果你有一系列的值插入,具有功能一起,我會建議使用的insertselect形式:

insert into fights(<list of columns, total_experience) 
    select <list of values>, 
      ($FIGHT_END - $FIGHT_START) * (select unitary_experience from spawnTypes where spawnType ='$SPAWN_POINT) 

一個有關表的註釋。表中的所有ID都是自動遞增的整數,這是一個好主意。在Oracle中,您可以通過創建一個序列來實現這一點(並且在大多數其他數據庫中它更簡單)。

+0

你好戈登,謝謝你真的很好的解釋:)我還有一個疑問,在加入操作不應該是ON st.spawn_point = f.for_spawn_point?我很困惑 – Jonathan 2013-03-02 21:32:46

+0

@Jonathan。 。 。是的,那是一個錯字。 – 2013-03-02 21:49:00

+0

好!我真的很感謝你:D – Jonathan 2013-03-02 21:51:11