检查后从表中返回值的 PL/SQL 函数
Posted
技术标签:
【中文标题】检查后从表中返回值的 PL/SQL 函数【英文标题】:PL/SQL function that returns a value from a table after a check 【发布时间】:2013-03-02 21:01:08 【问题描述】:我是 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), 'loot 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
如果您要插入一系列值以及函数,我建议使用insert
的select
形式:
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 中,您通过创建一个序列来做到这一点(在大多数其他数据库中它更简单)。
【讨论】:
您好 Gordon,谢谢您提供的非常好的解释 :) 我仍然怀疑连接操作不应该是 ON st.spawn_point = f.for_spawn_point?我很困惑 @Jonathan 。 . .是的,这是一个错字。以上是关于检查后从表中返回值的 PL/SQL 函数的主要内容,如果未能解决你的问题,请参考以下文章