首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 教學

Oracle 序列值獲取函數封裝:動態 SQL 實現通用 NEXTVAL/CURRVAL

     編輯:Oracle 教學

為何需要封裝函數?

PL/SQL 中無法直接使用變量序列名 (如 v_seq_name.NEXTVAL),需動態 SQL 執行。封裝為函數後,應用層可統一調用 get_seq_next('SEQ_NAME'),簡化代碼並統一異常處理。

通用獲取函數

-- 獲取下一值
CREATE OR REPLACE FUNCTION get_seq_next (seq_name IN VARCHAR2) RETURN NUMBER IS
  seq_val NUMBER;
BEGIN
  EXECUTE IMMEDIATE 'SELECT ' || seq_name || '.NEXTVAL FROM DUAL' INTO seq_val;
  RETURN seq_val;
END get_seq_next;

-- 獲取當前值 (需先在 Session 中調用過 NEXTVAL)
CREATE OR REPLACE FUNCTION get_seq_curr (seq_name IN VARCHAR2) RETURN NUMBER IS
  seq_val NUMBER;
BEGIN
  EXECUTE IMMEDIATE 'SELECT ' || seq_name || '.CURRVAL FROM DUAL' INTO seq_val;
  RETURN seq_val;
END get_seq_curr;

調用示例

DECLARE
  v_id NUMBER;
BEGIN
  v_id := get_seq_next('SEQ_ORDER_ID');  -- 返回 1001
  INSERT INTO orders (order_id, ...) VALUES (v_id, ...);
  
  -- 同一事務中再次獲取當前值
  v_id := get_seq_curr('SEQ_ORDER_ID');  -- 仍為 1001
END;

注意事項

  • EXECUTE IMMEDIATE 會觸發硬解析,高併發場景建議改用 DBMS_SQL 或在包變量中緩存游標。
  • 序列名建議大寫存儲,避免大小寫不匹配導致 ORA-00904。
  • CURRVAL 若 Session 未調用過 NEXTVAL 會拋出 ORA-08002。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved