函式:獲取一個序列的下一個數(沒有序列的話會自動建立)
阿新 • • 發佈:2021-08-09
獲取一個序列的下一個數
沒有序列的話會自動建立,省的每次手動建立序列了
-- 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;
參考文件: