預儲程序、函數與序列是業務邏輯封裝與主鍵生成的核心工具。本章涵蓋建立、參數模式、異常處理、序列緩存與管理實戰模式。
CREATE OR REPLACE PROCEDURE proc_get_person (
p_name IN VARCHAR2,
p_msg OUT VARCHAR2,
p_cursor OUT SYS_REFCURSOR
) AS
v_name VARCHAR2(64);
BEGIN
v_name := p_name;
OPEN p_cursor FOR
SELECT * FROM person WHERE name LIKE v_name || '%';
p_msg := 'SUCCESS';
COMMIT;
EXCEPTION
WHEN OTHERS THEN
p_msg := 'ERROR: ' || SQLERRM;
ROLLBACK;
END proc_get_person;
DROP PROCEDURE proc_get_person;
CREATE OR REPLACE FUNCTION fun_get_name (
p_name IN VARCHAR2,
p_gender IN VARCHAR2
) RETURN VARCHAR2 AS
v_result VARCHAR2(64);
BEGIN
SELECT name INTO v_result
FROM person
WHERE name = p_name AND gender = p_gender AND ROWNUM = 1;
RETURN v_result;
EXCEPTION
WHEN NO_DATA_FOUND THEN RETURN NULL;
END;
CREATE OR REPLACE FUNCTION fun_get_name2 (
p_name IN VARCHAR2,
p_gender OUT VARCHAR2
) RETURN VARCHAR2 AS
v_result VARCHAR2(64);
BEGIN
SELECT name, gender INTO v_result, p_gender
FROM person
WHERE name = p_name AND ROWNUM = 1;
RETURN v_result;
END;
DROP FUNCTION fun_get_name;
CREATE SEQUENCE seq_person_id
INCREMENT BY 1
START WITH 1
NOMAXVALUE
NOCYCLE
CACHE 20; -- 建議緩存 20~100,效能與間隙平衡
SELECT seq_person_id.NEXTVAL FROM dual; -- 下一個值 (首次回傳 START WITH)
SELECT seq_person_id.CURRVAL FROM dual; -- 當前 Session 最後值 (需先呼叫 NEXTVAL)
INSERT INTO person (id, name) VALUES (seq_person_id.NEXTVAL, '測試');
ALTER SEQUENCE seq_person_id MAXVALUE 99999999;
需變更起始值 → DROP SEQUENCE 重建。
DROP SEQUENCE seq_person_id;
SYS_REFCURSOR (弱型別 REF CURSOR),彈性最高。CACHE 100 + ORDER (RAC 環境) 平衡效能與有序性。ROLLBACK 並記錄 SQLERRM/SQLCODE 至日誌表。