獲取一個序列的下一個數
沒有序列的話會自動創建,省的每次手動創建序列了
-- 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/308506.html
標籤:Oracle
上一篇:一條有思考SQL撰寫(Oracle資料庫,DECODE函式)
下一篇:使用SqlSugar連接Oracle資料庫報錯需要參考Oracle.ManagedDataAccess.dll的處理方法
