获取一个序列的下一个数
没有序列的话会自动创建,省的每次手动创建序列了
-- 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;
参考文档:
内容来源于网络如有侵权请私信删除
文章来源: 博客园
- 还没有人评论,欢迎说说您的想法!