`
LewJun
  • 浏览: 9724 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Oracle 存储过程 根据机构编码生成序列号

 
阅读更多
CREATE OR REPLACE PROCEDURE PROCEDURE_GETSNBYORGCODE(P_ORGCODE IN VARCHAR2,
                                                     P_STATUS  OUT INTEGER,
                                                     P_ERRMSG  OUT VARCHAR2,
                                                     P_RESULT  OUT VARCHAR2) IS
  --
  -- 根据机构编码生成序列号
  -- LewJun
  -- 2018年9月28日 10点25分
  -- 最后修改时间 2018年9月28日 11点53分
  --
  --

  /*orgcode是否存在*/
  V_EXISTS_ORGCODE NUMBER;
  /*序列名称*/
  V_SEQNAME VARCHAR2(255);
  /*今天*/
  V_YYMMDD VARCHAR2(6);
  /*后缀后3位*/
  V_SUFFIX3 VARCHAR2(3);
  /*序列号开始*/
  V_SEQ_START_WITH VARCHAR2(50);
  /*sql语句*/
  V_SQL VARCHAR2(255);
  /*seq下一个值*/
  V_SEQ_NEXT_VAL NUMBER;
  /*seq中的日期*/
  V_SEQ_YYMMDD VARCHAR(6);
  /*异常:机构不存在*/
  V_EX_NOTFOUND_ORGCODE EXCEPTION;
  /*异常:该机构序列日期大于今天 */
  V_EX_SEQDATEGTNOW EXCEPTION;

BEGIN
  P_STATUS := 1;
  P_ERRMSG := 'ok';

  V_SEQNAME := 'SEQ_SN_' || P_ORGCODE;
  V_SUFFIX3 := '001';
  -- 1 判断orgcode在数据库中是否存在
  SELECT COUNT(1)
    INTO V_EXISTS_ORGCODE
    FROM TS_DEPT T
   WHERE T.MCHCODE = P_ORGCODE;
  IF V_EXISTS_ORGCODE <> 1 THEN
    /*抛出异常 机构不存在*/
    RAISE V_EX_NOTFOUND_ORGCODE;
  END IF;
  -- 存在

  /*是否存在这个V_SEQNAME*/
  SELECT COUNT(1)
    INTO V_EXISTS_ORGCODE
    FROM DBA_OBJECTS T
   WHERE LOWER(T.OBJECT_NAME) = LOWER(V_SEQNAME)
     AND T.STATUS = 'VALID'
     AND T.OBJECT_TYPE = 'SEQUENCE'
     AND T.OWNER = 'MCHIS';

  /*得到当天年月日*/
  SELECT TO_CHAR(SYSDATE, 'yyMMdd') INTO V_YYMMDD FROM DUAL;
  V_SEQ_START_WITH := P_ORGCODE || '' || V_YYMMDD || '' || V_SUFFIX3;
  /*如果不存在*/
  IF V_EXISTS_ORGCODE = 0 THEN
    /*创建序列*/
    EXECUTE IMMEDIATE 'create sequence ' || V_SEQNAME ||
                      ' minvalue 1 maxvalue 999999999999999999999999999 start with ' ||
                      V_SEQ_START_WITH || ' increment by 1';
    /*查询下一个seq*/
    V_SQL := 'SELECT ' || V_SEQNAME || '.NEXTVAL FROM DUAL';
    /*执行*/
    EXECUTE IMMEDIATE V_SQL
      INTO V_SEQ_NEXT_VAL;
  ELSE
    /*如果存在*/
    DBMS_OUTPUT.PUT_LINE('存在该seq');
    /*查询下一个seq*/
    V_SQL := 'SELECT ' || V_SEQNAME || '.NEXTVAL FROM DUAL';
    /*执行*/
    EXECUTE IMMEDIATE V_SQL
      INTO V_SEQ_NEXT_VAL;
  
    V_SEQ_YYMMDD := SUBSTR(V_SEQ_NEXT_VAL, LENGTH(P_ORGCODE) + 1, 6);
    IF V_YYMMDD < V_SEQ_YYMMDD THEN
      /*数据库序列大于了当天*/
      RAISE V_EX_SEQDATEGTNOW;
    ELSIF V_YYMMDD > V_SEQ_YYMMDD THEN
      /*判断序列当前值中的日期是否和今天一样*/
      DBMS_OUTPUT.PUT_LINE('seq 不是当天的');
      /*删除序列*/
      EXECUTE IMMEDIATE 'DROP SEQUENCE ' || V_SEQNAME;
    
      /*创建序列*/
      EXECUTE IMMEDIATE 'create sequence ' || V_SEQNAME ||
                        ' minvalue 1 maxvalue 999999999999999999999999999 start with ' ||
                        V_SEQ_START_WITH || ' increment by 1';
    
      /*查询下一个seq*/
      V_SQL := 'SELECT ' || V_SEQNAME || '.NEXTVAL FROM DUAL';
      /*执行*/
      EXECUTE IMMEDIATE V_SQL
        INTO V_SEQ_NEXT_VAL;
    END IF;
  END IF;

  /*给P_RESULT赋值*/
  P_RESULT := TO_CHAR(V_SEQ_NEXT_VAL);
EXCEPTION
  WHEN V_EX_NOTFOUND_ORGCODE THEN
    DBMS_OUTPUT.PUT_LINE('机构编码无效');
    P_STATUS := 0;
    P_ERRMSG := '机构编码无效';
  WHEN V_EX_SEQDATEGTNOW THEN
    DBMS_OUTPUT.PUT_LINE('该机构序列日期大于今天');
    P_STATUS := 0;
    P_ERRMSG := '该机构序列日期大于今天';
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('其它运行时错误');
    P_STATUS := 0;
    P_ERRMSG := '其它运行时错误';
    /*    DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_STACK);
    DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
    DBMS_OUTPUT.PUT_LINE(SQLCODE);
    DBMS_OUTPUT.PUT_LINE(SQLERRM);*/
    ROLLBACK;
END PROCEDURE_GETSNBYORGCODE;

 

MyBatis调用:

<select id="callProcedure1" parameterMap="PROCEDURE_GETSNBYORGCODE_MAP" statementType="CALLABLE">
    CALL PROCEDURE_GETSNBYORGCODE(?, ?, ?, ?)
</select>

<parameterMap type="java.util.Map" id="PROCEDURE_GETSNBYORGCODE_MAP">
    <parameter property="P_ORGCODE" mode="IN" jdbcType="VARCHAR"/>
    <parameter property="P_STATUS" mode="OUT" jdbcType="INTEGER"/>
    <parameter property="P_ERRMSG" mode="OUT" jdbcType="VARCHAR"/>
    <parameter property="P_RESULT" mode="OUT" jdbcType="VARCHAR"/>
</parameterMap>
<select id="callProcedure2" parameterType="java.util.Map" statementType="CALLABLE">
    {CALL PROCEDURE_GETSNBYORGCODE(
        #{P_ORGCODE, mode=IN, jdbcType=VARCHAR},
        #{P_STATUS, mode=OUT, jdbcType=INTEGER},
        #{P_ERRMSG, mode=OUT, jdbcType=VARCHAR},
        #{P_RESULT, mode=OUT, jdbcType=VARCHAR}
    )}
 </select>

 

 

分享到:
评论

相关推荐

    Oracle 11g的安装PDF

    创建序列(Sequence)是Oracle数据库中进行数据操作的另一个常用工具,它能够自动生成唯一的序列号。文档中提到的“createsequencePETSEQincrementby1”就是创建一个名为PETSEQ的序列,并设置其自增的步长为1。序列...

    oracle图形化视图的PLSQLDeveloper7的注册码

    PL/SQL Developer是一款专为Oracle数据库设计的集成开发环境(IDE),主要用于开发存储过程、触发器和其他Oracle数据库存储程序单元。随着越来越多的应用逻辑转移到Oracle服务器端执行,PL/SQL编程成为开发过程中不...

    Toad for Oracle 11

    2. **对象管理**:能够方便地浏览、创建、修改和删除数据库对象,如表、视图、索引、存储过程、触发器等。它支持图形化建模,使数据库设计更直观。 3. **性能分析**:内置性能监控工具,帮助用户识别性能瓶颈,通过...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    其一、就业面广:全球前100强企业99家都在使用ORACLE相关技术,中国政府机构,大中型企事业单位都能有ORACLE技术的工程师岗位。 其二、技术层次深:如果期望进入IT服务或者产品公司(类似毕博、DELL、IBM等),...

    创建Oracle触发器用于表中序列值自增长(Helloblock写作)

    ### 创建Oracle触发器用于表中序列值自增长 ...这种方法不仅简化了开发过程中的编码工作,还提高了数据的完整性和安全性。在实际应用中,根据不同的需求,可以进一步调整序列和触发器的配置,以满足更复杂的业务逻辑。

    oracle伪列以及伪表.doc

    它是一个18个字符的字符串,由64位编码组成,不存储在表中,但在查询时可获取。ROWID在更新、删除和快速访问特定行时非常有用。 4. ROWNUM:ROWNUM伪列在查询时生成,用于限制返回的结果集数量,它从1开始递增,但...

    SQL Assistant 6

    - **SQL Assistant sn.txt**:此文件可能包含了软件的序列号,用户在安装过程中根据提示输入此序列号,以完成激活和解锁全部功能。 总结来说,SQL Assistant 6是一款针对SQL Server的高效工具,通过其丰富的功能和...

    PLSQL Developer10.0.4.1708 安装程序+汉化包+注册

    - **对象管理**:创建、修改和删除数据库对象如表、视图、存储过程、函数和触发器。 - **报表和图表**:生成数据报表和统计图表,有助于数据分析和展示。 - **项目管理**:组织和管理与特定项目相关的所有文件和对象...

    PLSQL Developer10.0.3.1701 keygen+主程序+汉化包

    安装过程中通常会要求输入序列号或激活码,以便验证软件授权。 2. `chinese.exe`:这个文件是PLSQL Developer的汉化包。对于中文用户来说,这个文件非常重要,因为它将英文界面翻译成中文,使得用户更容易理解和...

    PLSQLDEV.rar

    这个工具提供了全面的功能,让数据库管理员和开发者能够高效地编写、测试和调试PL/SQL代码,包括存储过程、函数、触发器以及数据库对象的管理。 在"PLSQLDEV.rar"这个压缩包中,有两个主要的文件: 1. `plsqldev....

    pl sql Developer 8.02 (含注册码)

    PL/SQL是Oracle数据库的编程语言,结合了SQL的查询能力与过程式编程语言的特点,常用于创建存储过程、函数、触发器和包等数据库对象。 在描述中提到的“sn.txt”文件,通常包含的是软件的序列号或注册码,这是激活...

    plsqldeveloper中文版.rar

    3. "sn.txt":这可能是一个文本文件,通常用于存储序列号或激活码,用户在安装过程中需要输入这些信息以激活软件的完整功能。 在使用PL/SQL Developer时,用户可以享受到如下的主要功能: - **源代码编辑**:它提供...

    plsqlserver

    PL/SQL Developer是一款专业的Oracle数据库管理工具,由Allround Automations公司开发,它为数据库管理员和开发者提供了方便的环境来编写、调试、执行和管理PL/SQL代码。"plsqlserver"这个标题可能是对这款工具的...

    PL/SQL Developer 9.0.1.1613 注册机(完美算号激活)

    1. **源代码编辑**:它提供了一个全功能的文本编辑器,支持语法高亮、自动完成、代码折叠和错误检查,使编码过程更为流畅。 2. **调试功能**:内置的调试器允许设置断点、查看变量值、单步执行和跟踪代码执行,有助...

    PL.SQL.Developer.v7.0.1.1066

    2. **数据库对象管理**:用户可以直接在工具中浏览和管理数据库中的各种对象,如表、视图、存储过程、函数、触发器等。这包括创建、修改、删除以及查看对象的定义和属性。 3. **数据查看与操作**:提供了强大的数据...

    plsql developer注册码

    2. **数据库对象管理**:通过PL/SQL Developer,用户可以轻松地创建、修改、删除数据库表、视图、存储过程等对象,同时提供了一键式对象依赖关系分析,帮助理解数据库结构。 3. **性能分析**:工具内置的SQL和PL/...

    PLSQL Developer 10.0.5

    3. **数据库对象管理**:用户可以轻松地创建、修改和删除表、视图、存储过程、函数、触发器等各种数据库对象。此外,还有对象浏览器用于查看和管理数据库结构。 4. **数据操作**:支持数据的导入导出,以及直接在...

    PLSQL Developer 12 官方安装正式版(附中文语言包+注册码)

    - 支持编写、调试和执行PL/SQL代码,包括触发器、存储过程、函数和包。 - 自动完成和语法高亮,提高编码效率。 - 数据库对象的图形视图,便于查看和管理表、索引、视图等。 - 内置的图表工具,可直观展现数据关系。 ...

    PLSQL Developer 11 0 0 1762 带语言包 注册码

    3. **数据库对象管理**:可以直接在IDE中创建、修改和删除数据库表、视图、存储过程、触发器等对象。 4. **数据浏览与操作**:允许用户查看和编辑数据库中的数据,支持SQL查询和数据导出。 5. **项目管理**:通过...

    使用PowerDesigner 进行数据建模

    4. **利用序列号(Sequence)**:在需要自动生成唯一标识符的情况下,使用序列号可以简化编码工作,同时保证数据的唯一性。 综上所述,PowerDesigner是一款功能强大且灵活的数据建模工具,适用于从概念设计到物理...

Global site tag (gtag.js) - Google Analytics