在写存储过程的时候,有时不直接使用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中,游标对于实现复杂的数据操作和控制流程至关重要,特别是在存储过程和触发器中。 1. **游标简介** 游标提供了一种方式来遍历查询结果集,并允许应用程序一次处理一行。游标有显式和隐式两种类型。显式...
根据提供的标题、描述以及部分代码内容,我们可以详细探讨Oracle游标的使用方法,特别是明确游标(Explicit Cursor)和隐式游标(Implicit Cursor)的区别及其具体应用方式。 ### Oracle游标简介 在Oracle数据库中...
Oracle 游标是PL/SQL编程中不可或缺的一部分,它们允许程序员逐行处理查询结果,而不仅仅是获取单一数据点。在Oracle数据库中,游标主要用于在循环或其他控制结构中操作多行数据,使得处理复杂的数据操作变得更为...
在《ORACLE存储过程,函数,包,游标》这个文本文件中,可能包含了关于如何定义、调用和管理这些对象的示例代码和实践指导。通过阅读和理解这个文件,开发者能够深入了解Oracle数据库的动态编程能力,提升其在数据库...
### Oracle游标使用大全 #### 一、概述 在Oracle数据库中,游标是一种重要的机制,用于处理查询结果集中的数据。游标允许程序逐行处理数据,这在需要对多行数据进行循环处理时非常有用。本文档旨在提供一个全面的...
Oracle 教案:深入理解 Oracle 存储过程、游标与 SQL 语句及 PL/SQL Oracle 是全球领先的数据库管理系统提供商,不仅提供数据库产品,还包括中间件、云计算服务等全面的企业级解决方案。"Oracle"一词源于古希腊神话...
### Oracle中的游标详解 #### 一、引言 在Oracle数据库中,游标是一种非常重要的机制,它允许用户在程序中对查询结果进行逐行处理。游标分为两种主要类型:**隐式游标**和**显示游标**。此外,还可以利用游标进行...
游标的使用不仅仅限于查询语句,也适用于其它操作数据的DML语句,如INSERT、UPDATE和DELETE。对于这些DML语句,PL/SQL中的语法与SQL中基本一致,需要注意的是变量的作用范围,以及异常处理机制。 当执行DML语句后,...
DQL(Select)操作虽然不直接使用隐式游标,但其结果可以通过PL/SQL的内置变量访问,如`sql%found`、`sql%notfound`、`sql%rowcount`等。 - 隐式游标的一些关键属性包括: - `sql%found`:如果DML操作影响了行,则...
### Oracle存储过程开发基本规范详解 #### 一、概述 Oracle存储过程作为一种强大的数据库编程工具,在企业级应用中被广泛采用。为了确保存储过程的质量、可读性和可维护性,制定一套合理的编码规范至关重要。本文将...
- **隐式游标**:ORACLE自动管理的游标,通常在执行DML语句(如UPDATE、INSERT、DELETE)时使用。例如,当执行UPDATE语句后,`SQL%ROWCOUNT`属性可以返回受影响的行数。另外,`CURSOR FOR LOOP`结构简化了遍历查询...
本文将围绕“存储过程”、“游标”、“触发器”这三个核心概念,以及Oracle的安装流程,进行深入的探讨。 首先,让我们来看看“存储过程”。存储过程是预编译的SQL语句集合,存储在数据库中,可以被多次调用,以...
3. **Oracle触发器**:触发器是一种特殊的存储过程,会在特定的数据库事件(如INSERT、UPDATE或DELETE)发生时自动执行。`V_InsertEquip.sql`可能包含一个插入触发器的示例,这种触发器在向特定表中插入新数据时被...
隐式游标不需要声明和打开,就可以直接使用。隐式游标可以使用SELECT语句声明,并将结果集赋值给变量。 游标控制语句 游标控制语句包括声明游标语句、打开游标语句、游标取值语句和关闭游标语句。声明游标语句用于...
这份"oracle笔记(存储过程函数触发器游标流程控制等)"涵盖了Oracle数据库管理中的关键知识点,包括但不限于以下几个方面: 1. **存储过程与函数**:存储过程是预编译的SQL语句集合,用于执行特定任务。它们可以提高...
这篇博文“Oracle存储过程例子”可能提供了关于如何创建、调用和使用Oracle存储过程的实际示例。 首先,存储过程可以提高应用性能,因为它将多次执行的SQL语句预编译并存储在数据库中。每次调用时,只需要执行已...
本套教程全面覆盖了Oracle数据库的核心编程元素,包括存储过程、函数、触发器、异常处理、游标和存储包,这些都是数据库开发和管理中的关键概念。 首先,我们来详细了解存储过程。存储过程是一组预编译的SQL语句,...
在PL/SQL块中,DML(数据操纵语言)语句如`INSERT`, `UPDATE`, `DELETE`可以直接使用。然而,由于DML操作可能会引发异常,因此通常需要使用`EXCEPTION`部分来捕获和处理异常。例如,在删除员工记录之前,先检查该...
本文将详细讲解游标的使用方法以及如何自动生成序列号,同时会结合存储过程进行讨论。 首先,游标(Cursor)是数据库系统提供的一种数据访问机制,允许用户在结果集上进行前进、后退、读取或修改数据,就像在电子...