函数:获取一个序列的下一个数(没有序列的话会自动创建)

时间: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;

参考文档:

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

原文地址:https://www.cnblogs.com/soraxtube/p/15119041.html