oracle简单存储过程的编写

CREATE OR REPLACE PROCEDURE PROC_TT_TRMS_CAR_TASK
(
    P_BATCH_NUM     IN  NUMBER  DEFAULT 5000,   --处理数据量
    P_COMMIT_NUM    IN  NUMBER  DEFAULT 500     --批次提交数据量
) AS

    V_COUNT         INT DEFAULT 0;  -- 批量提交计数
    V_MID_COUNT     INT DEFAULT 0;  -- 中间表计数

/*
    CREATE DATE:2017-06-18
    CREATE BY:01369076
    DESC  :TT_TRMS_CAR_TASK 批量提取数据,中间表TT_TRMS_CAR_TASK_MID 用于比较 ,下发中转场表TT_TRMS_CAR_TASK_DIST

*/

BEGIN

 -- 批量提取
FOR RX IN ( SELECT T.*,ROWID  as rid  FROM tt_trms_car_task T WHERE T.DEAL_FLG = 0 AND ROWNUM <= P_BATCH_NUM )  LOOP

    V_MID_COUNT := 0;
    -- 查询中间表
    SELECT COUNT(*) INTO V_MID_COUNT  FROM tt_trms_car_task_mid M WHERE  M.TASK_ID = RX.TASK_ID AND M.POSITION_NO = RX.POSITION_NO AND M.ZONE_CODE = RX.ZONE_CODE ;
    IF V_MID_COUNT = 0 THEN
        -- mid表新增记录
        INSERT INTO TT_TRMS_CAR_TASK_MID
          (ID,
           ORIGINAL_ID,
           SEND_CAR_TM,
           REQUIRE_ID,
           TASK_ID,
           POSITION_NO,
           LINE_CODE,
           BATCH_CODE,
           PLAN_START_TM,
           ZONE_CODE,
           PLATE_NUM,
           DEL_FLAG,
           dest_code,
           stowage_city,
           DEAL_TM,
           DEAL_FLG,
           DEAL_IP,
           DEAL_COUNT,
           INSERT_TM,
           DELIVE_CODE)
        VALUES
          (SEQ_TT_TRMS_CAR_TASK_MID.NEXTVAL,
           RX.ORIGINAL_ID,
           RX.SEND_CAR_TM,
           RX.REQUIRE_ID,
           RX.TASK_ID,
           RX.POSITION_NO,
           RX.LINE_CODE,
           RX.BATCH_CODE,
           RX.PLAN_START_TM,
           RX.ZONE_CODE,
           RX.PLATE_NUM,
           RX.DEL_FLAG,
           RX.dest_code,
           RX.stowage_city,
           RX.DEAL_TM,
           RX.DEAL_FLG,
           RX.DEAL_IP,
           RX.DEAL_COUNT,
           CURRENT_TIMESTAMP,
           RX.DELIVE_CODE);
            -- dist表新增记录
        INSERT INTO TT_TRMS_CAR_TASK_DIST
          (ID,
           ORIGINAL_ID,
           SEND_CAR_TM,
           REQUIRE_ID,
           TASK_ID,
           POSITION_NO,
           LINE_CODE,
           BATCH_CODE,
           PLAN_START_TM,
           ZONE_CODE,
           PLATE_NUM,
           DEL_FLAG,
           dest_code,
           stowage_city,
           DEAL_TM,
           DEAL_FLG,
           DEAL_IP,
           DEAL_COUNT,
           INSERT_TM,
           DELIVE_CODE)
        VALUES
          (SEQ_TT_TRMS_CAR_TASK_DIST.NEXTVAL,
           RX.ORIGINAL_ID,
           RX.SEND_CAR_TM,
           RX.REQUIRE_ID,
           RX.TASK_ID,
           RX.POSITION_NO,
           RX.LINE_CODE,
           RX.BATCH_CODE,
           RX.PLAN_START_TM,
           RX.ZONE_CODE,
           RX.PLATE_NUM,
           RX.DEL_FLAG,
           RX.dest_code,
           RX.stowage_city,
           RX.DEAL_TM,
           RX.DEAL_FLG,
           RX.DEAL_IP,
           RX.DEAL_COUNT,
           CURRENT_TIMESTAMP,
           RX.DELIVE_CODE);
    ELSE
        -- 取中间表数据对比
        FOR RM IN (SELECT M.* ,ROWID AS rid FROM tt_trms_car_task_mid M WHERE M.TASK_ID = RX.TASK_ID AND M.POSITION_NO = RX.POSITION_NO AND M.ZONE_CODE = RX.ZONE_CODE AND ROWNUM=1 ) LOOP
           IF RM.ORIGINAL_ID < RX.ORIGINAL_ID THEN
             -- 版本号>当前版本号 mid表更新
              UPDATE TT_TRMS_CAR_TASK_MID
                  SET
                      ORIGINAL_ID   = RX.ORIGINAL_ID,
                      SEND_CAR_TM   = RX.SEND_CAR_TM,
                      REQUIRE_ID    = RX.REQUIRE_ID,
                      TASK_ID       = RX.TASK_ID,
                      POSITION_NO   = RX.POSITION_NO,
                      LINE_CODE     = RX.LINE_CODE,
                      BATCH_CODE    = RX.BATCH_CODE,
                      PLAN_START_TM = RX.PLAN_START_TM,
                      ZONE_CODE     = RX.ZONE_CODE,
                      PLATE_NUM     = RX.PLATE_NUM,
                      DEL_FLAG      = RX.DEL_FLAG,
                      dest_code     = RX.dest_code,
                      stowage_city  = RX.stowage_city,
                      DEAL_TM       = RX.DEAL_TM,
                      DEAL_FLG      = RX.DEAL_FLG,
                      DEAL_IP       = RX.DEAL_IP,
                      DEAL_COUNT    = RX.DEAL_COUNT,
                      INSERT_TM     = RX.INSERT_TM,
                      DELIVE_CODE   = RX.DELIVE_CODE
                WHERE ID = RM.ID;
               -- dist表新增记录
              INSERT INTO TT_TRMS_CAR_TASK_DIST
                (ID,
                 ORIGINAL_ID,
                 SEND_CAR_TM,
                 REQUIRE_ID,
                 TASK_ID,
                 POSITION_NO,
                 LINE_CODE,
                 BATCH_CODE,
                 PLAN_START_TM,
                 ZONE_CODE,
                 PLATE_NUM,
                 DEL_FLAG,
                 dest_code,
                 stowage_city,
                 DEAL_TM,
                 DEAL_FLG,
                 DEAL_IP,
                 DEAL_COUNT,
                 INSERT_TM,
                 DELIVE_CODE)
              VALUES
                (SEQ_TT_TRMS_CAR_TASK_DIST.NEXTVAL,
                 RX.ORIGINAL_ID,
                 RX.SEND_CAR_TM,
                 RX.REQUIRE_ID,
                 RX.TASK_ID,
                 RX.POSITION_NO,
                 RX.LINE_CODE,
                 RX.BATCH_CODE,
                 RX.PLAN_START_TM,
                 RX.ZONE_CODE,
                 RX.PLATE_NUM,
                 RX.DEL_FLAG,
                 RX.dest_code,
                 RX.stowage_city,
                 RX.DEAL_TM,
                 RX.DEAL_FLG,
                 RX.DEAL_IP,
                 RX.DEAL_COUNT,
                 CURRENT_TIMESTAMP,
                 RX.DELIVE_CODE);
           END IF;
        END LOOP;
    END IF;

        -- 更新tt_trms_car_task表数据状态
    UPDATE tt_trms_car_task SET DEAL_FLG = 2 WHERE ID = RX.id;

    --批次提交控制
    V_COUNT:=V_COUNT+1 ;
    IF(MOD(V_COUNT,P_COMMIT_NUM)=0)THEN
        COMMIT;
    END IF;

END LOOP;
COMMIT;
EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK;
        PKG_SYS_LOG.ERROR_LOG(NULL,
            ‘PROC_TT_TRMS_CAR_TASK‘,
            SYSDATE,
            SQLCODE,
            SQLERRM,
            DBMS_UTILITY.FORMAT_ERROR_BACKTRACE,NULL
        );
END PROC_TT_TRMS_CAR_TASK;

  

时间: 2024-10-07 07:49:55

oracle简单存储过程的编写的相关文章

Oracle简单的备份和恢复-导出和导入(2)

ylbtech-Oracle:Oracle简单的备份和恢复-导出和导入(2) 简单的备份和恢复-导出和导入(2) 1. 用户导入导出文件中的一张表(emp)返回顶部 0.1, 我们在sql plus中删除掉一张表emp,把dept表的记录删空. drop table emp; delete from dept; 之后我们先利用刚才导出的mytable.dmp导入emp表.具体导入步骤如下: 1.在命令行下输入imp命令. 2.系统首先提示我们输入用户名和密码,在这里我们可以用scott/tige

用NHibernate调用Oracle的存储过程

摘要 NHibernate2.1.1版终于可以调用Oracle的存储过程了,不过必须使用NHibernate.Driver.OracleDataClientDriver驱动(Oracle.DataAccess.dll),但这会导致hbm2ddl.keywords抛异常,所以也不是很完美. NHibernate调用Oracle的存储过程的方法 首先,在Oracle10g里面创建一个简单的存储过程,它的第一个参数必须是SYS_REFCURSOR类型的. 存储过程create or replace p

oracle的存储过程

用了两年Oracle还没写过存储过程,真是十分惭愧,从今天开始学习Oracle存储过程,完全零起点,争取每日一篇学习笔记,可能开始认识的不全面甚至有错误,但坚持下来一定会有收获. 1. 建立一个存储过程 create or replace PROCEDURE firstPro IS BEGIN DBMS_OUTPUT.PUT_LINE('Hello World!'); END; 其中IS关键字替换为AS关键字结果不会出现任何变化,大多认为他们是等同的,但也有一种说法解释为:一般PACKAGE 或

在存储过程中编写正确的事务处理代码

在 SQL Server 中数据库事务处理是个重要的概念,也稍微有些不容易理解,很多 SQL 初学者编写的事务处理代码存往往存在漏洞, 本文介绍了三种不同的方法,举例说明了如何在存储过程事务处理中编写正确的代码. 在编写 SQL Server 事务相关的存储过程代码时,经常看到下面这样的写法: begin tran update statement 1 ... update statement 2 ... delete statement 3 ... commit tran 这样编写的SQL存在

Oracle在存储过程中如何返回结果集

Oracle和Sqlserver不一样的地方有很多. 个人最深的体会是存储过程返回结果集,在Sqlserver中直接select查询就行,Oracle就不行了. 这里,就用最简单的例子说明存储过程返回结果集的例子 CREATE OR REPLACE PROCEDURE 存储过程名( 字段名 in VARCHAR2, l_result OUT TYPES.RQ_REF_CURSOR -- 包里面方法名 ) is str_sql varchar2(8000) := ''; begin str_sql

SQL Server:存储过程中编写事务处理的方法小结

/**8. SQLServer存储过程中编写事务处理的方法小结**/ 原文出处: http://www.jb51.net/article/80636.htm 本文我们介绍了三种不同的方法,举例说明了如何在存储过程事务处理中编写正确的代码. 1. 常见写法: 在编写SQL Server 事务相关的存储过程代码时,经常看到下面这样的写法: begin tran update statement 1 ... update statement 2 ... delete statement 3 ... c

oracle简单使用

连接方式 Oracle简单使用 Emp数据表 1.sqlplus命令 1)Scott用户登录:Sqlplus scott/tiger查询emp表的全部内容Select * from emp;问题:(1)表格的显示格式混乱(2)所有表格都有标题行设置每行显示的数据长度:set linesize 300;设置每次显示胡行数:set pagesize 30; 再执行 select * from emp: 命令格式:col job for a8; 列空格设定8 Col job for a8:select

Oracle简单学习

最近一段时间重温了oracle关于存储过程和oracle包以及function中的定义, 先看一下要用的表: devices(id number, name varchar2, age number) groups(id number, devicesid number, name varchar2, content varchar2) 在oracle中建立如下的package和package bodies, 下面给出里面具体的内容: 首先是packges下面的devices_pkg内容: 定义

oracle分页存储过程

oracle分页存储过程: CREATE OR REPLACE PROCEDURE FGK.prc_page (p_tableName in varchar2, --表名 p_strWhere in varchar2, --查询条件 p_orderColumn in varchar2, --排序的列 p_orderStyle in varchar2, --排序方式 p_curPage in out Number, --当前页 p_pageSize in out Number, --每页显示记录条