CREATE TABLE t_stu (
stuid NUMBER PRIMARY KEY,
stuname NVARCHAR2(50),
stusex NVARCHAR2(10),
stuadd NVARCHAR2(200)
);
CREATE OR REPLACE PROCEDURE p_insert_t_stu (
p_stuid IN NUMBER,
p_stuname IN NVARCHAR2,
p_stusex IN NVARCHAR2,
p_stuadd IN NVARCHAR2
) AS
BEGIN
INSERT INTO t_stu (stuid, stuname, stusex, stuadd)
VALUES (p_stuid, p_stuname, p_stusex, p_stuadd);
COMMIT;
END;
/
CREATE OR REPLACE PROCEDURE p_delete_t_stu (
p_stuid IN NUMBER,
p_msg OUT NVARCHAR2
) IS
v_exists NUMBER;
BEGIN
-- 檢查資料是否存在
SELECT COUNT(*) INTO v_exists FROM t_stu WHERE stuid = p_stuid;
IF v_exists = 0 THEN
p_msg := '查無此學號,刪除失敗';
RETURN;
END IF;
DELETE FROM t_stu WHERE stuid = p_stuid;
COMMIT;
p_msg := '刪除成功';
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
p_msg := '刪除失敗: ' || SQLERRM;
END;
/
CREATE OR REPLACE PROCEDURE p_update_t_stu (
p_stuid IN NUMBER,
p_stuname IN NVARCHAR2,
p_stusex IN NVARCHAR2,
p_stuadd IN NVARCHAR2
) AS
BEGIN
UPDATE t_stu
SET stuname = p_stuname,
stusex = p_stusex,
stuadd = p_stuadd
WHERE stuid = p_stuid;
IF SQL%ROWCOUNT = 0 THEN
RAISE_APPLICATION_ERROR(-20001, '查無此學號,修改失敗');
END IF;
COMMIT;
END;
/
-- 新增
EXEC p_insert_t_stu(1, '王小明', '男', '台北市信義區');
-- 刪除(需變數接收 OUT 參數)
VARIABLE v_msg NVARCHAR2(100);
EXEC p_delete_t_stu(1, :v_msg);
PRINT v_msg;
-- 修改
EXEC p_update_t_stu(1, '王大明', '男', '新北市板橋區');
INSERT INTO table (col1, col2)... 避免結構變更導致錯誤WHEN OTHERS 並 ROLLBACK,回傳錯誤碼與訊息SQL%ROWCOUNT 確認 DML 實際影響筆數RAISE_APPLICATION_ERROR(-20xxx, 'msg') 讓呼叫端可程式化處理FORALL + Collection 提升大量 DML 效能EXECUTE IMMEDIATE 處理動態表名/欄位DBMS_APPLICATION_INFO 設定模組/動作資訊預存程序封裝業務邏輯、減少網路往返、強化安全性。善用參數模式(IN/OUT/IN OUT)、例外處理與交易控制,能建立健壯且可維護的資料存取層。