`
keepwork
  • 浏览: 334276 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Oracle--存储过程

 
阅读更多

 开发者博客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--存储过程.ctb

    oracle-xe-11.2.0-1.0.x86_64.rpm.zip

    "oracle-xe-11.2.0" 这个标签强调了这个版本的具体信息,Oracle XE 11.2.0 是在 2011 年发布的,它包含了 Oracle 数据库 11g 第二版的主要功能,但限制了内存使用和存储大小,以适应轻量级需求。 在提供的压缩包...

    cx_Oracle-7.3.0.tar.gz

    - 支持游标的游标(`cursor.callproc()`),用于调用存储过程。 - 支持绑定变量(`cursor.execute(query, params)`),提高执行效率。 - 可以处理 LOB(大型对象)数据类型,如 BFILE、BLOB、CLOB 和 NCLOB。 10...

    oracle-database-server-12cR2-preinstall

    2. **系统调整**:预安装过程会检查并调整操作系统的参数,如内核参数、内存分配、磁盘空间和文件系统类型,以优化Oracle数据库的运行环境。 3. **用户和组设置**:创建并配置Oracle相关的用户和组,例如`oracle`...

    geoserver-2.13.2-oracle-plugin.zip

    此插件允许GeoServer直接连接到Oracle数据库,读取和存储地理空间信息,从而实现数据的实时发布和更新。 “oracle-readme.txt”文件通常包含了关于如何配置和使用Oracle数据库插件的重要信息,包括系统需求、安装...

    oracle-instantclient-12.2.0.1.0-1.x86_64的rpm格式

    一旦安装完成并配置好,Oracle Instant Client可用于开发和测试数据库连接,如创建数据库连接池、执行SQL查询、调用存储过程等。它也常用于数据库备份、性能监控和故障排查工具,因为它不需要完整的数据库服务器...

    sqlplus 11.2 安装包oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm

    通过SQL*Plus,你可以执行脚本、创建报告、进行数据操作以及管理数据库对象,如表、视图、存储过程等。它提供了丰富的交互式环境和高级特性,如格式化输出、条件处理、批处理等。 2. **Oracle Instant Client**:这...

    Oracle-11g-R2-RAC-with-ASM存储迁移-手记.docx

    Oracle 11g R2 RAC with ASM 存储迁移手记 本文详细介绍了如何将 Oracle RAC 的数据库数据迁移到新的存储设备上,并提供了详细的迁移步骤和图文说明。整个迁移过程中,使用了 ASM DISKGROUP 的方式来完成存储迁移,...

    cx_Oracle-5.1.2-11g.win32-py2.7.msi

    cx_Oracle还支持更高级的功能,如参数绑定、存储过程调用、事务控制、异常处理等。例如,你可以使用%s占位符来绑定变量,防止SQL注入攻击: ```python query = 'SELECT * FROM table_name WHERE column = %s' ...

    DBD-Oracle-1.75_2.tar.gz

    DBD-Oracle支持Oracle数据库的各种特性,包括复杂查询、存储过程、事务处理、游标、绑定变量等。在使用DBD-Oracle时,我们需要先安装Oracle客户端或Instant Client,因为DBD-Oracle需要这些库来建立连接。 在安装...

    Oracle 19C安装的补充包 oracle-database-preinstall

    5. **文件系统准备**:Oracle数据库需要特定的文件系统布局,包括数据文件、日志文件、控制文件等的存储位置。预安装包会帮助创建这些目录结构,并进行必要的权限设定。 6. **系统调优**:为了提高性能,预安装包...

    cx_Oracle-5.1.2-11g.win-amd64-py2.7.exe

    例如,执行存储过程: ```python cursor.callproc('stored_procedure_name', [param1, param2]) ``` 在处理大数据量时,cx_Oracle提供了批量操作的能力,可以显著提高性能: ```python cursor.executemany('...

    DM-ORACLE-SQLSERVER存储过程迁移.doc

    DM-ORACLE-SQLSERVER存储过程迁移,主要是数据库的存储过程备份,迁移说明文档

    oracle-support oracleasmlib kmod-oracleasm包

    4. 配置Oracle数据库以使用ASM:在数据库创建过程中选择ASM作为存储类型,并指定磁盘组。 5. 确保服务启动:配置系统在启动时加载OracleASM服务,以确保数据库在启动时可以正常工作。 总之,Oracle Support for ...

    geoserver-2.20.4-oracle-plugin.zip

    安装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在启动时...

    twp-oracle-database-in-memory-2245633-zhs.pdf

    通过动态大小调整和自动内存管理技术,Oracle Database In-Memory能够智能地管理数据在内存中的存储方式,确保数据访问的最优化。同时,In-Memory列存储支持动态压缩技术,这可以在有限的内存资源中存储更多的数据。...

    oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.rar

    - **PL/SQL执行**:用户可以编写和执行存储过程、函数和触发器等PL/SQL代码。 - **脚本执行**:可以一次性执行多个SQL或PL/SQL语句,方便进行批处理操作。 - **报告生成**:可以生成文本、HTML或CSV格式的报表,便于...

    DBD-Oracle-1.42.tar.gz

    DBD-Oracle 支持多种特性,如绑定参数、游标、事务处理、存储过程调用等,使得 Perl 开发者可以充分利用 Oracle 数据库的功能。这个模块的强大之处在于它允许你以 Perl 的简洁和灵活性来操作 Oracle 数据库,简化了...

Global site tag (gtag.js) - Google Analytics