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>
相关推荐
创建序列(Sequence)是Oracle数据库中进行数据操作的另一个常用工具,它能够自动生成唯一的序列号。文档中提到的“createsequencePETSEQincrementby1”就是创建一个名为PETSEQ的序列,并设置其自增的步长为1。序列...
2. **对象管理**:能够方便地浏览、创建、修改和删除数据库对象,如表、视图、索引、存储过程、触发器等。它支持图形化建模,使数据库设计更直观。 3. **性能分析**:内置性能监控工具,帮助用户识别性能瓶颈,通过...
其一、就业面广:全球前100强企业99家都在使用ORACLE相关技术,中国政府机构,大中型企事业单位都能有ORACLE技术的工程师岗位。 其二、技术层次深:如果期望进入IT服务或者产品公司(类似毕博、DELL、IBM等),...
### 创建Oracle触发器用于表中序列值自增长 ...这种方法不仅简化了开发过程中的编码工作,还提高了数据的完整性和安全性。在实际应用中,根据不同的需求,可以进一步调整序列和触发器的配置,以满足更复杂的业务逻辑。
它是一个18个字符的字符串,由64位编码组成,不存储在表中,但在查询时可获取。ROWID在更新、删除和快速访问特定行时非常有用。 4. ROWNUM:ROWNUM伪列在查询时生成,用于限制返回的结果集数量,它从1开始递增,但...
- **SQL Assistant sn.txt**:此文件可能包含了软件的序列号,用户在安装过程中根据提示输入此序列号,以完成激活和解锁全部功能。 总结来说,SQL Assistant 6是一款针对SQL Server的高效工具,通过其丰富的功能和...
- **对象管理**:创建、修改和删除数据库对象如表、视图、存储过程、函数和触发器。 - **报表和图表**:生成数据报表和统计图表,有助于数据分析和展示。 - **项目管理**:组织和管理与特定项目相关的所有文件和对象...
安装过程中通常会要求输入序列号或激活码,以便验证软件授权。 2. `chinese.exe`:这个文件是PLSQL Developer的汉化包。对于中文用户来说,这个文件非常重要,因为它将英文界面翻译成中文,使得用户更容易理解和...
这个工具提供了全面的功能,让数据库管理员和开发者能够高效地编写、测试和调试PL/SQL代码,包括存储过程、函数、触发器以及数据库对象的管理。 在"PLSQLDEV.rar"这个压缩包中,有两个主要的文件: 1. `plsqldev....
PL/SQL是Oracle数据库的编程语言,结合了SQL的查询能力与过程式编程语言的特点,常用于创建存储过程、函数、触发器和包等数据库对象。 在描述中提到的“sn.txt”文件,通常包含的是软件的序列号或注册码,这是激活...
3. "sn.txt":这可能是一个文本文件,通常用于存储序列号或激活码,用户在安装过程中需要输入这些信息以激活软件的完整功能。 在使用PL/SQL Developer时,用户可以享受到如下的主要功能: - **源代码编辑**:它提供...
PL/SQL Developer是一款专业的Oracle数据库管理工具,由Allround Automations公司开发,它为数据库管理员和开发者提供了方便的环境来编写、调试、执行和管理PL/SQL代码。"plsqlserver"这个标题可能是对这款工具的...
1. **源代码编辑**:它提供了一个全功能的文本编辑器,支持语法高亮、自动完成、代码折叠和错误检查,使编码过程更为流畅。 2. **调试功能**:内置的调试器允许设置断点、查看变量值、单步执行和跟踪代码执行,有助...
2. **数据库对象管理**:用户可以直接在工具中浏览和管理数据库中的各种对象,如表、视图、存储过程、函数、触发器等。这包括创建、修改、删除以及查看对象的定义和属性。 3. **数据查看与操作**:提供了强大的数据...
2. **数据库对象管理**:通过PL/SQL Developer,用户可以轻松地创建、修改、删除数据库表、视图、存储过程等对象,同时提供了一键式对象依赖关系分析,帮助理解数据库结构。 3. **性能分析**:工具内置的SQL和PL/...
3. **数据库对象管理**:用户可以轻松地创建、修改和删除表、视图、存储过程、函数、触发器等各种数据库对象。此外,还有对象浏览器用于查看和管理数据库结构。 4. **数据操作**:支持数据的导入导出,以及直接在...
- 支持编写、调试和执行PL/SQL代码,包括触发器、存储过程、函数和包。 - 自动完成和语法高亮,提高编码效率。 - 数据库对象的图形视图,便于查看和管理表、索引、视图等。 - 内置的图表工具,可直观展现数据关系。 ...
3. **数据库对象管理**:可以直接在IDE中创建、修改和删除数据库表、视图、存储过程、触发器等对象。 4. **数据浏览与操作**:允许用户查看和编辑数据库中的数据,支持SQL查询和数据导出。 5. **项目管理**:通过...
4. **利用序列号(Sequence)**:在需要自动生成唯一标识符的情况下,使用序列号可以简化编码工作,同时保证数据的唯一性。 综上所述,PowerDesigner是一款功能强大且灵活的数据建模工具,适用于从概念设计到物理...
1. **创建和管理数据库对象**:如表、视图、存储过程、函数、触发器等。 2. **编写和调试PL/SQL代码**:内置的编辑器支持语法高亮、代码折叠、自动完成,以及断点调试功能。 3. **数据库对象浏览和查询**:查看和...