解答例 - 実習課題2 - 13.3.ストアドプロシージャの利用
実習課題 2
販売データベースから、テーブル accept_order 中の受注に対して、支払い金額の平均より、支払い金額が多い受注に対して "Over"、少ない受注に対して "Under" を表示する関数を、PostgreSQL の PL/pgSQL 関数を用いて定義しなさい。また、定義した関数を用いて、受注番号と "Over" または "Under" を表示する SQL 文を記述しなさい。
- 支払い金額は 6章実習課題 2 を参考にすること。
解答例
/* * calc_payment(CHAR(4)) * 引数:受注番号 * 受注番号に対応する支払い金額を算出する。 * rank_payment()で利用される。 */ CREATE FUNCTION calc_payment(CHAR(4)) RETURNS INTEGER AS ' SELECT p.price * (100 - a.dc_rate) / 100 + a.option_price FROM accept_order a NATURAL JOIN product p WHERE a.o_num = $1; ' LANGUAGE 'sql'; /* * rank_payment(CHAR(4)) * 引数:受注番号 * 受注番号に対応する支払い金額に応じて、'Over', 'Under'を返す。 */ CREATE FUNCTION rank_payment(CHAR(4)) RETURNS CHAR(20) AS ' DECLARE order_num ALIAS FOR $1; average REAL; payment REAL; BEGIN SELECT INTO average AVG(calc_payment(o_num)) FROM accept_order; SELECT INTO payment calc_payment(order_num); IF payment > average THEN RETURN ''Over''; ELSIF payment < average THEN RETURN ''Under''; ELSE RETURN ''''; END IF; END; ' LANGUAGE 'plpgsql'; SELECT o_num AS 受注番号, rank_payment(o_num) AS 支払い金額 FROM accept_order;