检查后从表中返回值的 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

如果您要插入一系列值以及函数,我建议使用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 中,您通过创建一个序列来做到这一点(在大多数其他数据库中它更简单)。

【讨论】:

您好 Gordon,谢谢您提供的非常好的解释 :) 我仍然怀疑连接操作不应该是 ON st.spawn_point = f.for_spawn_point?我很困惑 @Jonathan 。 . .是的,这是一个错字。

以上是关于检查后从表中返回值的 PL/SQL 函数的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL - 如何从连接表中返回单行

从表中返回加起来达到最大给定值的项目

忽略 PL/SQL 函数的返回值

PL/SQL 创建返回两个字符串值的过程

SQL 函数,通过使用参数从表中返回值

验证 Jquery 后从表中获取值