PL / SQL函数,在检查后从表中返回值

时间:2013-03-02 21:01:09

标签: sql database function plsql

我是php和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(在斗争表内)返回与引用spawntypes表的这个生成点相关的unitary_experience,怎么能我做到了吗? : - / [f(x)]

为了计算从战斗中获得的总体验(unitary_experience * fight_length),我创建了一个函数,给定一个特定的战斗将使用fight_start减去fight_end所以现在我知道战斗持续了多长时间。并[f(Y)]

2)在数据库填充任务期间是否可以使用这两个函数(将它们返回的结果相乘)?

INSERT INTO战斗VALUES(....,f(x)* f(y),'抢劫A');

为了填充战斗表中的所有total_experience条目?

谢谢你的帮助

1 个答案:

答案 0 :(得分: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

如果要插入一系列值以及函数,我建议使用select形式的insert

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中,您可以通过创建序列来完成此操作(在大多数其他数据库中它更简单)。