sql - 检查后从表中返回值的 PL/SQL 函数

标签 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 fights VALUES(.... , f(x) * f(y), '战利品 A');

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

谢谢你的帮助

最佳答案

在 SQL 中,您通常不会谈论构建函数来做事。 SQL 的构建 block 是查询、 View 和存储过程(大多数 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 中,您通过创建一个序列来完成此操作(在大多数其他数据库中它更简单)。

关于sql - 检查后从表中返回值的 PL/SQL 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15179395/

相关文章:

sql - 用于存储应用程序数据的跨平台数据存储?

database - 跟进【删除(级联/限制)】和更新(级联/限制)

android - 是否可以从服务访问数据库?

php - 是否可以在 JOIN 中使用占位符?

mysql - 如何通过sql查询有效检查记录是否存在?

java - SELECT 中的多个值

mysql - SQL在更新后保留数据

actionscript-3 - 在 AS3 中在运行时(反射)检查匿名函数签名

c - C 中的 foreach 函数

使用函数为矩阵赋值时 C 程序崩溃