โจทย์
รับตัวเลข n พิมพ์เลขคี่ทั้งหมดจาก 1 ถึง n และคำนวณผลรวม
ตัวอย่าง: Input 7 → Output: 1, 3, 5,7 | Sum = 16
โค้ด PL/SQL (Oracle)
DECLARE
num NUMBER(3) := 1;
sumvar NUMBER(4) := 0;
BEGIN
DBMS_OUTPUT.PUT_LINE('The odd numbers are: ');
WHILE num <= 7 LOOP
DBMS_OUTPUT.PUT_LINE(num);
sumvar := sumvar + num;
num := num + 2;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Sum of odd numbers is ' || sumvar);
END;
/
ผลลัพธ์
The odd numbers are: 1 3 5 7 Sum of odd numbers is 16
อธิบายโค้ด
DECLAREส่วนประกาศตัวแปรnumเริ่มที่ 1 (เลขคี่แรก)sumvarสะสมผลรวมWHILE num <= 7 LOOP ... END LOOPวนลูปจนกว่า num > 7DBMS_OUTPUT.PUT_LINEพิมพ์แต่ละบรรทัด (ต้องSET SERVEROUTPUT ONใน SQL*Plus)||ต่อสตริง (Concatenation)
แก้ไขโค้ดต้นฉบับ (มี Bug)
โค้ดต้นฉบับมีข้อผิดพลาด:
- ใช้
numใน WHILE แต่ประกาศชื่อnumber(Oracle ไม่อนุญาตชื่อ Reserved Word) - ใช้
sum1ใน PUT_LINE สุดท้าย แต่ตัวแปรชื่อsumvar
โค้ดด้านบนแก้ไขแล้ว
รูปแบบ Parameterized (รับ n เข้ามา)
CREATE OR REPLACE PROCEDURE print_odd_sum(p_n IN NUMBER) AS
v_num NUMBER := 1;
v_sum NUMBER := 0;
BEGIN
DBMS_OUTPUT.PUT_LINE('Odd numbers up to ' || p_n || ':');
WHILE v_num <= p_n LOOP
DBMS_OUTPUT.PUT_LINE(v_num);
v_sum := v_sum + v_num;
v_num := v_num + 2;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Sum = ' || v_sum);
END;
/
-- เรียกใช้
SET SERVEROUTPUT ON
EXEC print_odd_sum(7);
MySQL Equivalent (Stored Procedure)
DELIMITER //
CREATE PROCEDURE print_odd_sum(IN p_n INT)
BEGIN
DECLARE v_num INT DEFAULT 1;
DECLARE v_sum INT DEFAULT 0;
DECLARE v_output TEXT DEFAULT '';
WHILE v_num <= p_n DO
SET v_output = CONCAT(v_output, v_num, ', ');
SET v_sum = v_sum + v_num;
SET v_num = v_num + 2;
END WHILE;
SELECT TRIM(TRAILING ', ' FROM v_output) AS OddNumbers, v_sum AS SumOfOdds;
END //
DELIMITER ;
CALL print_odd_sum(7);
ทางคณิตศาสตร์ (ไม่ต้อง Loop)
ผลรวมเลขคี่ 1 ถึง n (n เป็นเลขคี่): ((n+1)/2)^2
- n=7: ((7+1)/2)^2 = 4^2 = 16 ✓
- n=9: ((9+1)/2)^2 = 5^2 = 25 (1+3+5+7+9=25) ✓