場所(P)とレーサーの数(R)に基づいたスコアリングポイントと、points_idで示されるスコアリング形式をルックアップするテーブルがあります。表には2つのケースが示されています。ポイントは、points_id = 3のように、PとNの値によって直接決定される場合もあれば、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 |
3つの入力変数からポイントを返す関数を作成したいと思っていました。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(tbd)に移ります。