1. 程式人生 > 其它 >函式:獲取一個序列的下一個數(沒有序列的話會自動建立)

函式:獲取一個序列的下一個數(沒有序列的話會自動建立)

獲取一個序列的下一個數

沒有序列的話會自動建立,省的每次手動建立序列了

  -- Created on 2021/8/9 by WANGQY 
  CREATE OR REPLACE FUNCTION "F_GETMAXID_BYSEQUENCE"(paraSeqName in varchar2) --(入參)序列名稱
    return number is pragma AUTONOMOUS_TRANSACTION; --宣告為自治事務
  varCursorCount number; 	--(變數)記錄找到的序列數量
  varCursorID number; 		--(變數)與新建立的遊標相關聯的遊標ID。
  varSQL varchar2(1000); 	--(變數)SQL語句
  varExedRows number; 		--(變數)EXECUTE函式的返回值(增刪改時的返回值,其他操作下沒有意義)
  varMaxID number; 		--(返回值)序列最大ID。出錯時返回-1
  begin
    --查詢當前是否已存在這個序列
  SELECT count(*)
    into varCursorCount
    FROM USER_OBJECTS
   WHERE OBJECT_NAME = upper(paraSeqName)
     AND OBJECT_TYPE = 'SEQUENCE'
     AND STATUS = 'VALID';
  
  --如果已存在這個序列
  if varCursorCount > 0 then
    varSQL      := 'select ' || paraSeqName || '.nextval from dual';
    varCursorID := dbms_sql.open_cursor; --開啟遊標
    --向伺服器發出一個語句並檢查這個語句的語法和語義錯誤
    dbms_sql.parse(varCursorID, varSQL, dbms_sql.v7); 
    --在SELECT列表中定義了一個列或者表示式,這個列或者表示式將在遊標中返回和取出
    dbms_sql.define_column(varCursorID, 1, varMaxID); 
    --執行此語句,因為執行的是查詢,所以必須跟著Fetch_Rows函式併為單個行檢索資料 
    varExedRows := dbms_sql.execute(varCursorID); 
  
    if dbms_sql.fetch_rows(varCursorID) = 0 then
      --FETCH_ROWS從一個遊標中獲取一條記錄。--如果成功獲取一條記錄,這個引數返回1,如果沒有取回記錄,那麼返回0
      varMaxID := -1; --如果沒有取回記錄
    else
      dbms_sql.column_value(varCursorID, 1, varMaxID);
      --儲存過程COLUMN_VALUE定義了一個變數,用於從遊標中接收值
      --引數1:遊標的id。引數2:在遊標中返回資料的位置。引數3:通過前面的fetch操作在遊標中接收返回資料的變數
    end if;
  
    --關閉遊標
    dbms_sql.close_cursor(varCursorID);
  
    return varMaxID;
  
    --如果沒有這個序列
  else
    varSQL := 'create sequence  ' || paraSeqName ||
              ' minvalue 1 maxvalue 999999 start with 1 increment by 1 cache 20 cycle';
    --建立序列
    varCursorID := dbms_sql.open_cursor;
    dbms_sql.parse(varCursorID, varSQL, dbms_sql.v7);
    varExedRows := dbms_sql.execute(varCursorID);
    dbms_sql.close_cursor(varCursorID);
    --遞迴自己(進入if分支)
    return F_GETMAXID_BYSEQUENCE(paraSeqName);
  end if;
  
  --報錯
  exception when others then varSQL := sqlerrm; rollback;
  
  return - 1;
  
  end F_GETMAXID_BYSEQUENCE;

參考文件:

https://help.aliyun.com/document_detail/116934.html?utm_content=g_1000230851&spm=5176.20966629.toubu.3.f2991ddcpxxvD1#title-d59-srg-qwr