`

Oracle,存储过程,不直接使用insert,而使用游标的原因

阅读更多

在写存储过程的时候,有时不直接使用insert into 表名 values select * from XXX where XXX

而是使用游标进行数据的一条条插入,主要原因是数据库资源的问题。

 

使用insert直接插入整个查询的表的数据,数据库会等到都执行完成之后才能释放资源,若查询的过程比较慢,那么资源就一直处于使用状态。比较费资源。

 

若使用游标进行插入的话,可以设置游标多少条数据进行插入一次,然后释放一下资源。

 

 

 

 

 

游标的形式:

create or replace procedure PRC_RPN_REVISIT_REPORT is


cursor cur_rpn_revisit_report is
select A.*,
case when A.STATUS is not null and A.STATUS = '3'
         then '回访不成功'
         when A.STATUS is null and CONCAT(A.SERVICE_RESULT,' ') <> CONCAT( '不回访通过',' ')
           then '回访成功'
         when A.STATUS is null and A.SERVICE_RESULT ='不回访通过'
           then '不回访通过'
       end RINGBACK_STATUS--回访处理状态
 from (
SELECT  S.ROW_ID,
 S.BRANCH_ID,
       S.CUSTOMER_NAME,
       S.MID_PRODUCT_ID,
       S.MODEL_NAME,
     
       P.PROD_SERIAL_NO,
       F.SERVICE_TYPE_ID,
       F.SERVICE_MODE_ID,
       F.AUTO_AUDIT_RESULT,
       F.IF_WARRANT,
       S.AREA_CODE1,
       F.AUDIT_BILL,
      C.RINGBACK_TIME,
       S.TELEPHONE2,
       S.TELEPHONE1,
       S.TELEPHONE3,
       case when S.AREA_CODE1 is not null and S.TELEPHONE1 is not null
         then
           '家庭电话:' || S.AREA_CODE1 || '-' || S.TELEPHONE1
         end HOMEPHONE,
        case when S.TELEPHONE2 is not null
          then
              '移动电话:' || S.TELEPHONE2
        end MOBILEPHONE,
        case when S.TELEPHONE3 is not null
          then
             '其他电话:' || S.TELEPHONE3
          end OFFICEPHONE,
     
       C.DISSATIS_CODE,
       C.RINGBACK_DESC,
       F.WITHDRAW_REASON,
       E.PRICE_DIFFERENCE,
       F.SERVICE_FINISH_TIME,
       C.SERVICE_RESULT,
       S.REQUIRE_SERVICE_DATE,
       C.VISIT_TIMES,
       C.TARGET_CALLCENTER_ID,
       C.RINGBACKER,
       C.CALLCENTER_ID,
       C.RINGBACK_RESULT,
       C.STATUS,   
       F.SERVICE_CORP_NAME,
       P.BUY_DATE,
       I.REMARK,
       A.APPEAL_DESC,
       F.SERVICE_CORP_ID,
       C.SATIS_ID,
       C.SATIS_DESC,
       C.SATIS_DEDUCT,
       F.RETURN_TIMES,
       S.BELONG_CENTER,
       F.FIRST_BRANCH_ID,
       S.product_id,
       ( select t.codename from v_codelist t where t.kindvalue='RINGBACKER' and t.codevalue =C.RINGBACKER) RINGBACKER_NAME ,
       ( select t.codename from v_codelist t where t.kindvalue='PROD_MID' and t.codevalue =S.MID_PRODUCT_ID) MID_PRODUCT_NAME ,
       ( select t.codename from v_codelist t where t.kindvalue='RINGBACK_RESULT' and t.codevalue =C.RINGBACK_RESULT) RINGBACK_RESULT_NAME ,
       ( select t.codename from v_codelist t where t.kindvalue='ORG_DEPT_DV' and t.codevalue =S.BRANCH_ID) BRANCH_NAME ,
       ( select t.codename from v_codelist t where t.kindvalue='SERVICE_TYPE' and t.codevalue =F.SERVICE_TYPE_ID) SERVICE_TYPE_NAME ,
       ( select distinct t.codename from v_codelist t where t.kindvalue='SERVICE_MODE' and t.codevalue =F.SERVICE_MODE_ID) SERVICE_MODE_NAME ,
       ( select distinct t.codename from v_codelist t where t.kindvalue='DISSATIS_CODE' and t.codevalue =C.DISSATIS_CODE) DISSATIS_CODE_NAME ,
       ( select distinct t.codename from v_codelist t where t.kindvalue='IF_WARRANT' and t.codevalue =F.IF_WARRANT) IF_WARRANT_NAME ,
       ( select distinct t.codename from v_codelist t where t.kindvalue='SATISFACTION' and t.codevalue =C.SATIS_ID) SATIS_NAME ,
       ( select distinct t.codename from v_codelist t where t.kindvalue='CALL_CENTER' and t.codevalue =C.TARGET_CALLCENTER_ID) TARGET_CALLCENTER_NAME ,
       ( select distinct t.codename from v_codelist t where t.kindvalue='CALL_CENTER' and t.codevalue =C.CALLCENTER_ID) CALLCENTER_NAME
  FROM WB_SERVICE_INFO          S,
       WB_CALL_ON_TASK          C,
       WB_SERVICE_FEEDBACK      F,
       WB_CUSTOMER_PRODUCT      P,
       EM_RETURN_REQ_BILL       E,
       WB_SERVICE_FEEDBACK_ITEM I,
       WB_SERVICE_CORP_APPEAL   A
 WHERE 1 = 1
   AND C.ACTIVE_FLAG = '1'
   AND C.WB_ID = F.ROW_ID
   AND S.ROW_ID = F.ROW_ID
   AND S.ROW_ID = A.WB_ID(+)
   AND P.ROW_ID = S.CUSTOMER_PROD_ID
   AND S.ROW_ID = E.RETURN_WB_NO(+)
   AND (C.STATUS = '3' OR C.STATUS IS NULL)
   AND F.ROW_ID = I.WB_ID(+)
   AND I.PRIMARY_FLAG(+) = '1'
   AND F.WB_STATUS != '20'
  
   and C.RINGBACK_TIME >= trunc(sysdate-90)
   and C.RINGBACK_TIME < trunc(sysdate)
 
 order by a.row_id asc
) A;


   lv_rpn_revisit_report RPN_REVISIT_REPORT%rowtype;

begin

delete from RPN_REVISIT_REPORT t where t.RINGBACK_TIME < add_months(sysdate,-3);
--commit;

for  sendRec in cur_rpn_revisit_report loop

 begin
       lv_rpn_revisit_report.ROW_ID := sendRec.ROW_ID;
       lv_rpn_revisit_report.BRANCH_ID := sendRec.BRANCH_ID;
       lv_rpn_revisit_report.CUSTOMER_NAME := sendRec.CUSTOMER_NAME;
       lv_rpn_revisit_report.MID_PRODUCT_ID := sendRec.MID_PRODUCT_ID;
       lv_rpn_revisit_report.MODEL_NAME := sendRec.MODEL_NAME;
       lv_rpn_revisit_report.PROD_SERIAL_NO := sendRec.PROD_SERIAL_NO;
       lv_rpn_revisit_report.SERVICE_TYPE_ID := sendRec.SERVICE_TYPE_ID;
       lv_rpn_revisit_report.SERVICE_MODE_ID := sendRec.SERVICE_MODE_ID;
       lv_rpn_revisit_report.AUTO_AUDIT_RESULT := sendRec.AUTO_AUDIT_RESULT;
       lv_rpn_revisit_report.IF_WARRANT := sendRec.IF_WARRANT;
       lv_rpn_revisit_report.AREA_CODE1 := sendRec.AREA_CODE1;
       lv_rpn_revisit_report.AUDIT_BILL := sendRec.AUDIT_BILL;
       lv_rpn_revisit_report.RINGBACK_TIME := sendRec.RINGBACK_TIME;
       lv_rpn_revisit_report.TELEPHONE2 := sendRec.TELEPHONE2;
       lv_rpn_revisit_report.TELEPHONE1 := sendRec.TELEPHONE1;
       lv_rpn_revisit_report.TELEPHONE3 := sendRec.TELEPHONE3;
       lv_rpn_revisit_report.HOMEPHONE := sendRec.HOMEPHONE;
       lv_rpn_revisit_report.MOBILEPHONE := sendRec.MOBILEPHONE;
       lv_rpn_revisit_report.OFFICEPHONE := sendRec.OFFICEPHONE;
       lv_rpn_revisit_report.DISSATIS_CODE := sendRec.DISSATIS_CODE;
       lv_rpn_revisit_report.RINGBACK_DESC := sendRec.RINGBACK_DESC;
       lv_rpn_revisit_report.WITHDRAW_REASON := sendRec.WITHDRAW_REASON;
       lv_rpn_revisit_report.PRICE_DIFFERENCE := sendRec.PRICE_DIFFERENCE;
       lv_rpn_revisit_report.SERVICE_FINISH_TIME := sendRec.SERVICE_FINISH_TIME;
       lv_rpn_revisit_report.SERVICE_RESULT := sendRec.SERVICE_RESULT;
       lv_rpn_revisit_report.REQUIRE_SERVICE_DATE := sendRec.REQUIRE_SERVICE_DATE;
       lv_rpn_revisit_report.VISIT_TIMES := sendRec.VISIT_TIMES;
       lv_rpn_revisit_report.TARGET_CALLCENTER_ID := sendRec.TARGET_CALLCENTER_ID;
       lv_rpn_revisit_report.RINGBACKER := sendRec.RINGBACKER;
       lv_rpn_revisit_report.CALLCENTER_ID := sendRec.CALLCENTER_ID;
       lv_rpn_revisit_report.RINGBACK_RESULT := sendRec.RINGBACK_RESULT;
       lv_rpn_revisit_report.STATUS := sendRec.STATUS;
       lv_rpn_revisit_report.RINGBACK_STATUS := sendRec.RINGBACK_STATUS;
       lv_rpn_revisit_report.SERVICE_CORP_NAME := sendRec.SERVICE_CORP_NAME;
       lv_rpn_revisit_report.BUY_DATE := sendRec.BUY_DATE;
       lv_rpn_revisit_report.REMARK := sendRec.REMARK;
      
       lv_rpn_revisit_report.APPEAL_DESC := sendRec.APPEAL_DESC;
       lv_rpn_revisit_report.SERVICE_CORP_ID := sendRec.SERVICE_CORP_ID;
       lv_rpn_revisit_report.SATIS_ID := sendRec.SATIS_ID;
       lv_rpn_revisit_report.SATIS_DESC := sendRec.SATIS_DESC;
       lv_rpn_revisit_report.SATIS_DEDUCT := sendRec.SATIS_DEDUCT;
       lv_rpn_revisit_report.RETURN_TIMES := sendRec.RETURN_TIMES;
       lv_rpn_revisit_report.BELONG_CENTER := sendRec.BELONG_CENTER;
       lv_rpn_revisit_report.FIRST_BRANCH_ID := sendRec.FIRST_BRANCH_ID;
       lv_rpn_revisit_report.product_id := sendRec.product_id;
       lv_rpn_revisit_report.RINGBACKER_NAME := sendRec.RINGBACKER_NAME;
       lv_rpn_revisit_report.RINGBACK_RESULT_NAME := sendRec.RINGBACK_RESULT_NAME;
       lv_rpn_revisit_report.BRANCH_NAME := sendRec.BRANCH_NAME;
       lv_rpn_revisit_report.SERVICE_TYPE_NAME := sendRec.SERVICE_TYPE_NAME;
       lv_rpn_revisit_report.SERVICE_MODE_NAME := sendRec.SERVICE_MODE_NAME;
       lv_rpn_revisit_report.DISSATIS_CODE_NAME := sendRec.DISSATIS_CODE_NAME;
       lv_rpn_revisit_report.IF_WARRANT_NAME := sendRec.IF_WARRANT_NAME;
       lv_rpn_revisit_report.SATIS_NAME := sendRec.SATIS_NAME;
       lv_rpn_revisit_report.TARGET_CALLCENTER_NAME := sendRec.TARGET_CALLCENTER_NAME;
       lv_rpn_revisit_report.CALLCENTER_NAME := sendRec.CALLCENTER_NAME;
 
       exception  when others then
             null;
        end;

        insert into RPN_REVISIT_REPORT values lv_rpn_revisit_report;

end loop;

commit;

EXCEPTION   WHEN OTHERS THEN

   rollback;

 
end PRC_RPN_REVISIT_REPORT;

 

 

直接插入的形式:

create or replace procedure PRC_RPN_VISITER_COUNT is

begin

 DELETE FROM  RPN_VISITER_COUNT_CALLCENTER T where T.RINGBACK_TIME <add_months(sysdate,-3);
-- commit;
   
 INSERT INTO RPN_VISITER_COUNT_CALLCENTER
 (ROW_ID,
   PRODUCT_ID,
   RINGBACK_TIME,
   SERVICE_RESULT,
   PROJECT_CODE,
   STATUS,
   PSN_NAME,
   org_id)
SELECT f_get_report_rowid('rpn_visiter_count_callcenter'),
 t1.product_id,
           T1.RINGBACK_TIME,
           T1.SERVICE_RESULT,
           T1.PROJECT_CODE,
           T1.STATUS,
           T2.PSN_NAME,
           t2.org_id
      FROM WB_CALL_ON_TASK T1, V_PERSON_DEPT_MAP T2
     WHERE T1.RINGBACKER = T2.PSN_ACCOUNT(+)
     AND T1.RINGBACK_TIME >= trunc(sysdate-1)
     AND T1.RINGBACK_TIME < trunc(sysdate);
 
 commit;

EXCEPTION   WHEN OTHERS THEN

   rollback;
    
 
end PRC_RPN_VISITER_COUNT;

分享到:
评论

相关推荐

    oracle存储过程游标

    ### Oracle 存储过程与游标使用...通过以上分析,我们可以看到Oracle存储过程与游标的应用十分广泛,不仅能够提升开发效率,还能增强系统的稳定性和安全性。熟练掌握这些技术对于数据库管理员和开发人员来说至关重要。

    Oracle 数据库游标使用大全

    在Oracle中,游标对于实现复杂的数据操作和控制流程至关重要,特别是在存储过程和触发器中。 1. **游标简介** 游标提供了一种方式来遍历查询结果集,并允许应用程序一次处理一行。游标有显式和隐式两种类型。显式...

    Oracle游标使用详解

    根据提供的标题、描述以及部分代码内容,我们可以详细探讨Oracle游标的使用方法,特别是明确游标(Explicit Cursor)和隐式游标(Implicit Cursor)的区别及其具体应用方式。 ### Oracle游标简介 在Oracle数据库中...

    ORACLE存储过程,函数,包,游标

    在《ORACLE存储过程,函数,包,游标》这个文本文件中,可能包含了关于如何定义、调用和管理这些对象的示例代码和实践指导。通过阅读和理解这个文件,开发者能够深入了解Oracle数据库的动态编程能力,提升其在数据库...

    Oracle游标使用大全

    ### Oracle游标使用大全 #### 一、概述 在Oracle数据库中,游标是一种重要的机制,用于处理查询结果集中的数据。游标允许程序逐行处理数据,这在需要对多行数据进行循环处理时非常有用。本文档旨在提供一个全面的...

    Oracle教案 Oracle 存储过程 游标 SQL语句 PL/SQL

    Oracle 教案:深入理解 Oracle 存储过程、游标与 SQL 语句及 PL/SQL Oracle 是全球领先的数据库管理系统提供商,不仅提供数据库产品,还包括中间件、云计算服务等全面的企业级解决方案。"Oracle"一词源于古希腊神话...

    oracle 隐式游标,显示游标,游标循环

    ### Oracle中的游标详解 #### 一、引言 在Oracle数据库中,游标是一种非常重要的机制,它允许用户在程序中对查询结果进行逐行处理。游标分为两种主要类型:**隐式游标**和**显示游标**。此外,还可以利用游标进行...

    Oracle 游标使用大全.pdf

    游标的使用不仅仅限于查询语句,也适用于其它操作数据的DML语句,如INSERT、UPDATE和DELETE。对于这些DML语句,PL/SQL中的语法与SQL中基本一致,需要注意的是变量的作用范围,以及异常处理机制。 当执行DML语句后,...

    非常详细的Oracle游标整理

    DQL(Select)操作虽然不直接使用隐式游标,但其结果可以通过PL/SQL的内置变量访问,如`sql%found`、`sql%notfound`、`sql%rowcount`等。 - 隐式游标的一些关键属性包括: - `sql%found`:如果DML操作影响了行,则...

    Oracle存储过程最基本的开发规范

    ### Oracle存储过程开发基本规范详解 #### 一、概述 Oracle存储过程作为一种强大的数据库编程工具,在企业级应用中被广泛采用。为了确保存储过程的质量、可读性和可维护性,制定一套合理的编码规范至关重要。本文将...

    ORACLE中的游标汇总

    - **隐式游标**:ORACLE自动管理的游标,通常在执行DML语句(如UPDATE、INSERT、DELETE)时使用。例如,当执行UPDATE语句后,`SQL%ROWCOUNT`属性可以返回受影响的行数。另外,`CURSOR FOR LOOP`结构简化了遍历查询...

    存储过程 游标 触发器 Oracle安装

    本文将围绕“存储过程”、“游标”、“触发器”这三个核心概念,以及Oracle的安装流程,进行深入的探讨。 首先,让我们来看看“存储过程”。存储过程是预编译的SQL语句集合,存储在数据库中,可以被多次调用,以...

    oracle函数触发器游标等几个小例子

    3. **Oracle触发器**:触发器是一种特殊的存储过程,会在特定的数据库事件(如INSERT、UPDATE或DELETE)发生时自动执行。`V_InsertEquip.sql`可能包含一个插入触发器的示例,这种触发器在向特定表中插入新数据时被...

    Oracle12c数据库基础教程Oracle12c数据库游标、存储过程和触发器.pptx

    隐式游标不需要声明和打开,就可以直接使用。隐式游标可以使用SELECT语句声明,并将结果集赋值给变量。 游标控制语句 游标控制语句包括声明游标语句、打开游标语句、游标取值语句和关闭游标语句。声明游标语句用于...

    oracle笔记(存储过程函数触发器游标流程控制等)

    这份"oracle笔记(存储过程函数触发器游标流程控制等)"涵盖了Oracle数据库管理中的关键知识点,包括但不限于以下几个方面: 1. **存储过程与函数**:存储过程是预编译的SQL语句集合,用于执行特定任务。它们可以提高...

    oracle存储过程例子

    这篇博文“Oracle存储过程例子”可能提供了关于如何创建、调用和使用Oracle存储过程的实际示例。 首先,存储过程可以提高应用性能,因为它将多次执行的SQL语句预编译并存储在数据库中。每次调用时,只需要执行已...

    1-oracle培训整套教程(存储过程-函数-触发器,异常处理,游标.存储包)

    本套教程全面覆盖了Oracle数据库的核心编程元素,包括存储过程、函数、触发器、异常处理、游标和存储包,这些都是数据库开发和管理中的关键概念。 首先,我们来详细了解存储过程。存储过程是一组预编译的SQL语句,...

    Oracle 游标 Oracle 游标

    在PL/SQL块中,DML(数据操纵语言)语句如`INSERT`, `UPDATE`, `DELETE`可以直接使用。然而,由于DML操作可能会引发异常,因此通常需要使用`EXCEPTION`部分来捕获和处理异常。例如,在删除员工记录之前,先检查该...

    游标使用方法

    本文将详细讲解游标的使用方法以及如何自动生成序列号,同时会结合存储过程进行讨论。 首先,游标(Cursor)是数据库系统提供的一种数据访问机制,允许用户在结果集上进行前进、后退、读取或修改数据,就像在电子...

Global site tag (gtag.js) - Google Analytics