CONSTANT integer := 3; sente_mark marubatsu_field.mark%TYPE; gote_rec RECORD; display_cur CURSOR FOR SELECT row_id, column_id, COALESCE(mark, ' ') AS mark FROM marubatsu_field ORDER BY row_id, column_id; display_text text := '';
OR rownum > 3 THEN RAISE EXCEPTION '行指定の数字が有効範囲外を指定して います。'; ELSIF columnnum < 1 OR columnnum > 3 THEN RAISE EXCEPTION '列指定の数字が有効範囲外を指定して います。'; END IF;
row_count != (init_row_num * init_column_num) THEN DELETE FROM marubatsu_field; FOR i IN 1 .. init_row_num LOOP FOR j IN 1 .. init_column_num LOOP INSERT INTO marubatsu_field (row_id, column_id) VALUES (i, j); END LOOP; END LOOP; END IF;
row_id = rownum AND column_id = columnnum; IF sente_mark IS NOT NULL THEN -- すでにマークが入っていたらメッセージ RAISE EXCEPTION '指定された位置はすでにマークされていま す。'; ELSE UPDATE marubatsu_field SET mark = '◦' WHERE row_id = rownum AND column_id = columnnum; END IF;
FROM marubatsu_field WHERE mark is null ORDER BY random() limit 1; IF NOT FOUND THEN -- 全部埋まっていたら例外を発生させる RAISE EXCEPTION SQLSTATE 'ABCDE' USING MESSAGE = 'もう書き込める場所があ りません。'; ELSE UPDATE marubatsu_field SET mark = '×' WHERE row_id = gote_rec.row_id AND column_id = gote_rec.column_id; END IF; EXCEPTION -- 全部埋まっていた場合に発生した例外をキャッチしてメッセージを表示 WHEN SQLSTATE 'ABCDE' THEN RAISE NOTICE '%', SQLERRM; END; -- サブブロック終了