开发者博客:www.developsearch.com
savepoint
保存点,是事务中的一点,通过rollback可以返回到某个保存点。
一个事务中可以有多个保存点,一旦事务提交,该事务中的保存点会自动被删除,那么无论刚才做了多少个保存点,都统统没有了。
SAVEPOINT ROLLBACK_C2_POINT; ... ROLLBACK TO ROLLBACK_C2_POINT;
输出异常信息
dbms_output.put_line("..................");
raise_application_error
用于在plsql使用程序中自定义不正确消息,将应用程序专有的错误从服务器端转达到客户端应用程序(其他机器上的SQLPLUS或者其他前台开发语言)。
该异常只好在数据库端的子程序(流程、函数、包、触发器)中运用,而无法在匿名块和客户端的子程序中运用。
语法为 :raise_application_error(error_number,error_msg[,[truefalse]]);
其中
error_number用于定义不正确号,该不正确号必须在-20000到-20999之间的负整数;
error_msg用于指定不正确消息,并且该消息的长度无法超过2048字节;
第三个参数假如为true,则该不正确会被放在先前不正确堆栈中,假如为false(默认值)则会替代先前所有不正确。
IF product_not_found THEN RAISE_APPLICATION_ERROR(-20123,'Invald product code'TRUE); ENDIF; 例:阻止小于18岁的用户增加到数据库 employee 表中 CREATE OR REPALCE TRIGGER minimun_age_check BEFORE INSERT ON employee FOR EACH ROW BEGIN IF ADD_MONTHS( :new.birth_date, 18*12) > SYSDATE THEN RAISE_APPLICATION_ERROR(-20001, 'Employees must at least eighteen years of age.'); END IF; END; 下面我们编写一个客户端程序,为了简单,同样用PL/SQL调用 DECLARE no_babies_allowed EXCEPTION; /*将名称与用于触发器中的错误号码关联起来*/ PRAGMA EXCEPTION_INIT(no_babies_allowed, -20001); BEGIN INSERT INTO employee .; EXCEPTION WHEN no_babies_allowed THEN /* || SQLERRM 将传递给内置过程 RAISE_APPLICATION_ERROR 的消息返回 */ DBMS_OUTPUT.PUT_LINE(SQLERRM); END;
新折扣例子:验证两个组合是否完全相同
@SuppressWarnings("unchecked") public String validateSetsRepeat(final String distCodes, final String regionCodes, final String timeCodes, final String businessCodes, final String cargoCodes, final String appendCodes, final Long setId) { Object object = getHibernateTemplate().execute(new HibernateCallback() { @SuppressWarnings("deprecation") public Object doInHibernate(Session session) throws HibernateException, SQLException { CallableStatement statement = session.connection().prepareCall("{call PKG_VALID_SET_INTERSECT.CDH_CHECK_REPEAT_RBTSET(?,?,?,?,?,?,?)}"); statement.setString(1, distCodes); statement.setString(2, regionCodes); statement.setString(3, businessCodes); statement.setString(4, cargoCodes); statement.setString(5, timeCodes); statement.setString(6, appendCodes); statement.setLong(7, setId == null ? -1L : setId); statement.registerOutParameter(7, Types.BIGINT); statement.execute(); return statement.getObject(7); } }); return object == null ? null : object.toString(); } PROCEDURE CDH_CHECK_REPEAT_RBTSET(DIRS IN VARCHAR2, REGIONS IN VARCHAR2, BUSINESS IN VARCHAR2, CARGOS IN VARCHAR2, TIMES IN VARCHAR2, APPENDS IN VARCHAR2, SETID IN OUT NUMBER) AS V_COUNT NUMBER; BEGIN FOR RBT_SET IN (SELECT T.SET_ID, T.DIR_ID, T.REGION_DMNSN_ID, T.BUSINESS_DMNSN_ID, T.CARGO_DMNSN_ID, T.TIME_DMNSN_ID, T.APPEND_DMNSN_ID FROM CDH_NEWRBT_SET T WHERE T.SET_ID <> DECODE(SETID, NULL, -1, SETID)) LOOP -- 判断流向是否完全相等 依据:如果A-B=B-A 表示A,B两项完全相等 WITH DIR AS (SELECT D.ORG_DIST_CODE || '_' || D.DESC_DIST_CODE FROM CDH_NEWRBT_SET_DIR D WHERE D.DIR_ID = RBT_SET.DIR_ID), IN_DIR AS (SELECT * FROM TABLE(SPLIT_STR(DIRS))) SELECT SUM(M) INTO V_COUNT FROM (SELECT COUNT(0) AS M FROM (SELECT DIR.* FROM DIR MINUS SELECT IN_DIR.* FROM IN_DIR) UNION SELECT COUNT(0) FROM (SELECT IN_DIR.* FROM IN_DIR MINUS SELECT DIR.* FROM DIR)); -- 判断流向是否完全相等 等于零表示A-B=B-A 全等,接下来判断其他维度是否全等 IF V_COUNT = 0 THEN -- 判断区域类型 是否完全相同 V_COUNT := COUNT_DMNSN_MINUS(RBT_SET.REGION_DMNSN_ID, REGIONS); IF V_COUNT = 0 THEN -- 判断业务类型 是否完全相同 V_COUNT := COUNT_DMNSN_MINUS(RBT_SET.BUSINESS_DMNSN_ID, BUSINESS); IF V_COUNT = 0 THEN -- 判断快件内容 是否完全相同 V_COUNT := COUNT_DMNSN_MINUS(RBT_SET.CARGO_DMNSN_ID, CARGOS); IF V_COUNT = 0 THEN -- 判断时效 是否完全相同 V_COUNT := COUNT_DMNSN_MINUS(RBT_SET.TIME_DMNSN_ID, TIMES); IF V_COUNT = 0 THEN -- 判断附加费 是否完全相同 V_COUNT := COUNT_DMNSN_MINUS(RBT_SET.APPEND_DMNSN_ID, APPENDS); IF V_COUNT = 0 THEN -- 运行到此处表示检测到完全相同的组合 SETID := RBT_SET.SET_ID; -- 立即中断返回 RETURN; END IF; END IF; END IF; END IF; END IF; END IF; END LOOP; -- 如果以上循环查找未返回结果 表示没有找到完全相同的组合 程序返回NULL SETID := NULL; END;
开发者博客:www.developsearch.com
相关推荐
ORACLE--存储过程.ctb
"oracle-xe-11.2.0" 这个标签强调了这个版本的具体信息,Oracle XE 11.2.0 是在 2011 年发布的,它包含了 Oracle 数据库 11g 第二版的主要功能,但限制了内存使用和存储大小,以适应轻量级需求。 在提供的压缩包...
- 支持游标的游标(`cursor.callproc()`),用于调用存储过程。 - 支持绑定变量(`cursor.execute(query, params)`),提高执行效率。 - 可以处理 LOB(大型对象)数据类型,如 BFILE、BLOB、CLOB 和 NCLOB。 10...
2. **系统调整**:预安装过程会检查并调整操作系统的参数,如内核参数、内存分配、磁盘空间和文件系统类型,以优化Oracle数据库的运行环境。 3. **用户和组设置**:创建并配置Oracle相关的用户和组,例如`oracle`...
此插件允许GeoServer直接连接到Oracle数据库,读取和存储地理空间信息,从而实现数据的实时发布和更新。 “oracle-readme.txt”文件通常包含了关于如何配置和使用Oracle数据库插件的重要信息,包括系统需求、安装...
一旦安装完成并配置好,Oracle Instant Client可用于开发和测试数据库连接,如创建数据库连接池、执行SQL查询、调用存储过程等。它也常用于数据库备份、性能监控和故障排查工具,因为它不需要完整的数据库服务器...
通过SQL*Plus,你可以执行脚本、创建报告、进行数据操作以及管理数据库对象,如表、视图、存储过程等。它提供了丰富的交互式环境和高级特性,如格式化输出、条件处理、批处理等。 2. **Oracle Instant Client**:这...
Oracle 11g R2 RAC with ASM 存储迁移手记 本文详细介绍了如何将 Oracle RAC 的数据库数据迁移到新的存储设备上,并提供了详细的迁移步骤和图文说明。整个迁移过程中,使用了 ASM DISKGROUP 的方式来完成存储迁移,...
cx_Oracle还支持更高级的功能,如参数绑定、存储过程调用、事务控制、异常处理等。例如,你可以使用%s占位符来绑定变量,防止SQL注入攻击: ```python query = 'SELECT * FROM table_name WHERE column = %s' ...
DBD-Oracle支持Oracle数据库的各种特性,包括复杂查询、存储过程、事务处理、游标、绑定变量等。在使用DBD-Oracle时,我们需要先安装Oracle客户端或Instant Client,因为DBD-Oracle需要这些库来建立连接。 在安装...
5. **文件系统准备**:Oracle数据库需要特定的文件系统布局,包括数据文件、日志文件、控制文件等的存储位置。预安装包会帮助创建这些目录结构,并进行必要的权限设定。 6. **系统调优**:为了提高性能,预安装包...
例如,执行存储过程: ```python cursor.callproc('stored_procedure_name', [param1, param2]) ``` 在处理大数据量时,cx_Oracle提供了批量操作的能力,可以显著提高性能: ```python cursor.executemany('...
DM-ORACLE-SQLSERVER存储过程迁移,主要是数据库的存储过程备份,迁移说明文档
4. 配置Oracle数据库以使用ASM:在数据库创建过程中选择ASM作为存储类型,并指定磁盘组。 5. 确保服务启动:配置系统在启动时加载OracleASM服务,以确保数据库在启动时可以正常工作。 总之,Oracle Support for ...
安装Oracle插件的过程包括: 1. 下载并解压`geoserver-2.20.4-oracle-plugin.zip`。 2. 将`ojdbc8-19.10.0.0.jar`和`gt-jdbc-oracle-26.4.jar`文件复制到GeoServer的`WEB-INF/lib`目录下,这会使得GeoServer在启动时...
通过动态大小调整和自动内存管理技术,Oracle Database In-Memory能够智能地管理数据在内存中的存储方式,确保数据访问的最优化。同时,In-Memory列存储支持动态压缩技术,这可以在有限的内存资源中存储更多的数据。...
- **PL/SQL执行**:用户可以编写和执行存储过程、函数和触发器等PL/SQL代码。 - **脚本执行**:可以一次性执行多个SQL或PL/SQL语句,方便进行批处理操作。 - **报告生成**:可以生成文本、HTML或CSV格式的报表,便于...
DBD-Oracle 支持多种特性,如绑定参数、游标、事务处理、存储过程调用等,使得 Perl 开发者可以充分利用 Oracle 数据库的功能。这个模块的强大之处在于它允许你以 Perl 的简洁和灵活性来操作 Oracle 数据库,简化了...