我有一个表格,可以根据 Place (P) 和 Number of Racers(R) 以及 points_id 指示的得分格式查找得分点。表中显示了两种情况。有时这些点直接由 P 和 N 的值确定,如 points_id =3 中的其他时间,它们最容易通过 pts_calc 列中显示的简单计算确定。
|points_id| P | N |points|pts_calc|
| 1 | 0 | 0 | NULL | pin |
| 1 |DNS| 0 | NULL | nin+1 |
| 3 | 1 | 0 |102.00| NULL |
| 3 | 2 | 0 | 98.00| NULL |
| 3 | 3 | 0 | 96.00| NULL |
| 3 | 4 | 0 | 93.00| NULL |
| 3 | 5 | 0 | 91.00| NULL |
| 3 | 6 | 0 | 89.00| NULL |
| 3 |DNF| 0 | 85.00| NULL |
我希望创建一个从三个输入变量返回点的函数。points_id,P,N。下面是我尝试过的。
CREATE FUNCTION POINTS(pid INT,pin VARCHAR(3),nin INT)
RETURNS DEC(6,2)
DETERMINISTIC
BEGIN
DECLARE pts DECIMAL(6,2);
DECLARE pcalc VARCHAR(20);
SELECT points,pts_calc INTO pts,pcalc FROM scoring_points WHERE points_id=pid AND (P=pin OR P='0') AND (N=nin or N=0);
IF(pts IS NULL) THEN
SET @s= CONCAT('SET pts = ',pcalc);
PREPARE stmt FROM @s;
EXECUTE stmt;
END IF;
RETURN pts;
END
但我得到了这个错误。
1336 - 存储函数或触发器中不允许使用动态 SQL
进一步的研究表明 Prepare 语句不仅在函数中被允许,而且在过程中被允许。我希望做类似的事情;
SELECT SUM(Points(pid,place,numb)) FROM t1 GROUP BY racer.id
但除非有人有好主意,否则请进入 B 计划(待定)。