Oracle游标的性能优化 请问这个该怎么实现性能优化? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果可以,改成关联批量update的方式,不要游标,游标是逐条处理,相比批量update效率低些 实在不行,把游标取得的数据塞到一个临时表里, 下面的update语句关联临时表 怎么去弄 求SQL insert into tmp_table select * 然后update DATA_POLICYENset col= (select b.col from tmp_table b就这个意思啊,建一张表tmp_table,把需要的临时数据集放进去,update DATA_POLICYEN的时候关联这张表,就不需要用游标了,明白了吗 游标优化,关键是优化游标的查询sql,你查询sql都没发,怎么优化啊。 另外你是根据rowid更新的,如果查询时候配合了order by应该效率很高的,关键还是看你的查询sql INSERT INTO DATA_POLICYENDORKINDBASEINFO( POLICYNO, ENDORSEQNO, PLANCODE, RISKCODE, ITEMNO, ITEMKINDNO, KINDCODE, KINDNAME, ITEMDETAILCODE, ITEMDETAILLIST, MANUALPOLICYNO, -- ENDORNO, -- ENDORTYPE, -- ENDORTYPENAME, BUSINESSTYPE, CLASSCODE, INTERMEDIARYCODE, INTERMEDIARYCNNAME, AGREEMENTNO, SOLUTIONCODE, POLICYTYPE, APPLINAME, INSUREDNAME, STARTDATE, ENDDATE, UWYEAR, SUMGROSSPREMIUMA, SUMNETPREMIUMA, COMMISSIONA, SURCHARGEAMOUNTA, DISCOUNTRATE, COMMISIONRATE, CLIENTDISCOUNTA, UNDERWRITEENDDATE, UNDERWRITECODE, SALESMANCODE, OPERATORCODE, COMPANYCODE, ACCOUNTDATE, INPUTDATE, ALLOWRENEWIND, ISSUECOMPANY, ENDORTYPE, BUSINESSSOURCE, SUMINSUREDA, LIMITA, ORIGALCOMPANYCODE, UPDATEDATE, INSUREDCODE, PROMOTIONCODE, APPLICODE, OUTREINSCODE, OUTPOLICYNO, BROKERCODE, DEBITACCEPTER, COINSISSUEEXPENSE, DUESTARTDATE, TRCODE, TRNAME, SPECIALACCEPTANCE, CURRENCY, EXCHGRATE, OCCUPATION, OCCUPATIONNAME, TICCODE, TICCODENAME, --SUMGROSSPREMIUMANEW, --SUMNETPREMIUMANEW, --COMMISSIONANEW, --SURCHARGEAMOUNTANEW, --SUMINSUREDANEW, --LIMITANEW, -- KINDITEMRATE, KINDRISKRATE, Insuredsubjectmattercode, Insuredsubjectmatterdesc, Covercode, Covername, EmployeesClasscode, EmployeesOccupations, FACPLANCODE )SELECT A.POLICYNO , '000' ENDORSEQNO, ETL_FUNC_PACKAGE.GET_GUPOLICYCOPYRISK1(B.POLICYNO,B.ENDORSEQNO,B.RISKCODE,'PLANCODE') PLANCODE, B.RISKCODE, C.ITEMNO, C.ITEMKINDNO, C.KINDCODE, C.KINDNAME, C.ITEMDETAILCODE, C.ITEMDETAILLIST, A.MANUALPOLICYNO, -- ENDORNO, -- ENDORTYPE, -- ENDORTYPENAME, A.BUSINESSTYPE, ETL_FUNC_PACKAGE.GET_GUPOLICYCOPYRISK1(P_POLICYNO,'000',P_RISKCODE,'RISKCLASS'), A.INTERMEDIARYCODE, ETL_FUNC_PACKAGE.GET_AGENTNAME(INTERMEDIARYCODE) INTERMEDIARYCNNAME, A.AGREEMENTNO, A.SOLUTIONCODE, CASE WHEN A.RENEWIND = '0' AND A.ENDORSEQNO = '000' THEN 'N' --新单 WHEN A.RENEWIND = '1' AND A.ENDORSEQNO = '000' THEN 'R' --续保单 WHEN A.ENDORSEQNO != '000' THEN 'E' --批单 END POLICYTYPE, A.APPLINAME, A.INSUREDNAME, TRUNC(B.STARTDATE), TRUNC(B.ENDDATE), A.UWYEAR, NVL(C.GROSSPREMIUM,0), NVL(C.NETPREMIUM,0), 0 COMMISSIONA, 0 SURCHARGEAMOUNTA, 0 DISCOUNTRATE, 0 COMMISIONRATE, 0 CLIENTDISCOUNTA, A.UNDERWRITEENDDATE,A.UNDERWRITECODE, A.SALESMANCODE,A.OPERATORCODE, ETL_FUNC_PACKAGE.GET_COMPANYCODE(A.COMPANYCODE) COMPANYCODE, TRUNC(GREATEST(B.STARTDATE,A.UNDERWRITEENDDATE)) ACCOUNTDATE, TRUNC(A.INPUTDATE), A.ALLOWRENEWIND, ETL_FUNC_PACKAGE.GET_COMPANYCODE(A.ISSUECOMPANY) ISSUECOMPANY, '00' ENDORTYPE, A.BUSINESSSOURCE, NVL(C.SUMINSURED,0)*DECODE(C.CALCULATEIND,'1',1,0), -- 不计保额取保额为0 0 LIMITA, A.COMPANYCODE, SYSDATE, a.insuredcode, A.PROMOTIONCODE, A.APPLICODE, ETL_FUNC_PACKAGE.GET_POLICYCOPYREINSCEDEDINFO(P_POLICYNO, '000', 'OUTREINSCODE'), ETL_FUNC_PACKAGE.GET_POLICYCOPYREINSCEDEDINFO(P_POLICYNO, '000', 'OUTPOLICYNO'), ETL_FUNC_PACKAGE.GET_POLICYCOPYREINSCEDEDINFO(P_POLICYNO, '000', 'BROKERCODE'), ETL_FUNC_PACKAGE.GET_POLICYCOPYREINSCEDEDINFO(P_POLICYNO, '000', 'DEBITACCEPTER'), 0, -- A.COINSISSUEEXPENSE,-- TODO TRUNC(B.STARTDATE) DUESTARTDATE, A.TRCODE, ETL_FUNC_PACKAGE.GET_TRNAME(A.TRCODE), A.SPECIALACCEPTANCE, A.CURRENCY, V_EXCHRATE, GET_GUPOLICYCOPYEMPOLYINFO('OCCUPATION',P_POLICYNO,P_ENDORSEQNO,C.ITEMNO), GET_GUPOLICYCOPYEMPOLYINFO('OCCUPATIONNAME',P_POLICYNO,P_ENDORSEQNO,C.ITEMNO), GET_GUPOLICYCOPYEMPOLYINFO('TICCODE',P_POLICYNO,P_ENDORSEQNO,C.ITEMNO), GET_GUPOLICYCOPYEMPOLYINFO('TICCODENAME',P_POLICYNO,P_ENDORSEQNO,C.ITEMNO), --SUMGROSSPREMIUMANEW, --SUMNETPREMIUMANEW, --COMMISSIONANEW, --SURCHARGEAMOUNTANEW, --SUMINSUREDANEW, --LIMITANEW, -- 0 KINDITEMRATE, 0 KINDRISKRATE, GET_GUPOLICYCOPYITEMKINDINFO('INSUREDSUBJECTMATTERCODE',subStr(B.RISKCODE,0,2),P_POLICYNO,P_ENDORSEQNO,B.PLANCODE,B.RISKCODE,C.ITEMKINDNO) Insuredsubjectmattercode, GET_GUPOLICYCOPYITEMKINDINFO('INSUREDSUBJECTMATTERDESC',subStr(B.RISKCODE,0,2),P_POLICYNO,P_ENDORSEQNO,B.PLANCODE,B.RISKCODE,C.ITEMKINDNO) Insuredsubjectmatterdesc, GET_GUPOLICYCOPYITEMKINDINFO('COVERCODE',subStr(B.RISKCODE,0,2),P_POLICYNO,P_ENDORSEQNO,B.PLANCODE,B.RISKCODE,C.ITEMKINDNO) Covercode, GET_GUPOLICYCOPYITEMKINDINFO('COVERNAME',subStr(B.RISKCODE,0,2),P_POLICYNO,P_ENDORSEQNO,B.PLANCODE,B.RISKCODE,C.ITEMKINDNO) Covername, GET_GUPOLICYCOPYITEMKINDINFO('CLASSCODE',subStr(B.RISKCODE,0,2),P_POLICYNO,P_ENDORSEQNO,B.PLANCODE,B.RISKCODE,C.ITEMKINDNO) EmployeesClasscode, GET_GUPOLICYCOPYITEMKINDINFO('OCCUPATIONS',subStr(B.RISKCODE,0,2),P_POLICYNO,P_ENDORSEQNO,B.PLANCODE,B.RISKCODE,C.ITEMKINDNO) EmployeesOccupations, D.PLANCODE FROM GUPOLICYCOPYMAIN A,GUPOLICYCOPYRISK B,GUPOLICYCOPYITEMKIND C,GRFACPOLICY D WHERE A.POLICYNO = B.POLICYNO AND A.ENDORSEQNO = B.ENDORSEQNO AND A.POLICYNO = C.POLICYNO AND A.ENDORSEQNO = C.ENDORSEQNO AND A.POLICYNO = P_POLICYNO AND B.RISKCODE = C.RISKCODE AND A.ENDORSEQNO = P_ENDORSEQNO AND B.RISKCODE = P_RISKCODE AND C.POLICYNO = D.POLICYNO(+) AND C.ENDORSEQNO = D.ENDORSEQNO(+) AND C.ITEMNO=D.DANGERUNITNO(+); -- 设置险别保额/保费/佣金/征费 FOR REC_KIND IN CUR_KIND LOOP GET_GUPOLICYCOPYKINDINFO(P_POLICYNO,P_ENDORSEQNO,P_RISKCODE,REC_KIND.ITEMNO,REC_KIND.ITEMKINDNO,V_KINDINFO); UPDATE DATA_POLICYENDORKINDBASEINFO T SET T.SUMGROSSPREMIUMA = V_KINDINFO.GROSSPREMIUMKIND * V_EXCHRATE, T.SUMNETPREMIUMA = V_KINDINFO.NETPREMIUMKIND * V_EXCHRATE, T.SUMINSUREDA = T.SUMINSUREDA * V_EXCHRATE, T.COMMISSIONA = V_KINDINFO.COMMISSIONKIND * V_EXCHRATE, T.CLIENTDISCOUNTA = V_KINDINFO.DISCOUNTKIND * V_EXCHRATE, T.COMMISIONRATE = V_KINDINFO.COMMISSIONRATE , T.DISCOUNTRATE = V_KINDINFO.DISCOUNTRATE, T.SURCHARGEAMOUNTA = V_KINDINFO.SURCHARGEAMOUNTKIND* V_EXCHRATE , T.LIMITA = V_KINDINFO.LIMITKIND * V_EXCHRATE, T.KINDITEMRATE = V_KINDINFO.KINDITEMRATE, T.KINDRISKRATE = V_KINDINFO.KINDRISKRATE WHERE T.ROWID = REC_KIND.ROW_ID; V_TOTALKINDCOMMISION := V_TOTALKINDCOMMISION + V_KINDINFO.COMMISSIONKIND; V_TOTALKINDDISCOUNT := V_TOTALKINDDISCOUNT + V_KINDINFO.DISCOUNTKIND; V_TOTALKINDLIMIT := V_TOTALKINDLIMIT + V_KINDINFO.LIMITKIND; IF V_RISKCOMMISION = 0 OR V_RISKDISCOUNT = 0 OR V_RISKLIMIT = 0 THEN V_RISKCOMMISION := V_KINDINFO.COMMISSIONRISK; V_RISKDISCOUNT := V_KINDINFO.DISCOUNTRISK; V_RISKLIMIT := V_KINDINFO.LIMITRISK; END IF; END LOOP;这是游标内容 一条oracle 中的sql语句? Oracle sql语句如何写 ORacle转SQl2000 一个简单的oracle问题 如何消除重复的记录 在数据库中的基本资料表,是否要设为其它表的外键. 请问有谁知道163邮箱的后台数据库的数据结构或者工作原理? linux下研究oracle的朋友们!你是一个真正的DBA吗! 如何提高查询效率?大侠帮忙!! 各位大侠,请问有没有编写PL/SQL脚本程序好用一点的工具?急~~~ oracle如何获得复杂表的满足一定条件的前面几个数据? ORA-12158错误
然后
update DATA_POLICYEN
set col= (select b.col from tmp_table b
就这个意思啊,建一张表tmp_table,把需要的临时数据集放进去,update DATA_POLICYEN的时候关联这张表,就不需要用游标了,明白了吗
另外你是根据rowid更新的,如果查询时候配合了order by应该效率很高的,关键还是看你的查询sql
POLICYNO,
ENDORSEQNO,
PLANCODE,
RISKCODE,
ITEMNO,
ITEMKINDNO,
KINDCODE,
KINDNAME,
ITEMDETAILCODE,
ITEMDETAILLIST,
MANUALPOLICYNO,
-- ENDORNO,
-- ENDORTYPE,
-- ENDORTYPENAME,
BUSINESSTYPE,
CLASSCODE,
INTERMEDIARYCODE,
INTERMEDIARYCNNAME,
AGREEMENTNO,
SOLUTIONCODE,
POLICYTYPE,
APPLINAME,
INSUREDNAME,
STARTDATE,
ENDDATE,
UWYEAR,
SUMGROSSPREMIUMA,
SUMNETPREMIUMA,
COMMISSIONA,
SURCHARGEAMOUNTA,
DISCOUNTRATE,
COMMISIONRATE,
CLIENTDISCOUNTA,
UNDERWRITEENDDATE,
UNDERWRITECODE,
SALESMANCODE,
OPERATORCODE,
COMPANYCODE,
ACCOUNTDATE,
INPUTDATE,
ALLOWRENEWIND,
ISSUECOMPANY,
ENDORTYPE,
BUSINESSSOURCE,
SUMINSUREDA,
LIMITA,
ORIGALCOMPANYCODE,
UPDATEDATE,
INSUREDCODE,
PROMOTIONCODE,
APPLICODE,
OUTREINSCODE,
OUTPOLICYNO,
BROKERCODE,
DEBITACCEPTER,
COINSISSUEEXPENSE,
DUESTARTDATE,
TRCODE,
TRNAME,
SPECIALACCEPTANCE,
CURRENCY,
EXCHGRATE,
OCCUPATION,
OCCUPATIONNAME,
TICCODE,
TICCODENAME,
--SUMGROSSPREMIUMANEW,
--SUMNETPREMIUMANEW,
--COMMISSIONANEW,
--SURCHARGEAMOUNTANEW,
--SUMINSUREDANEW,
--LIMITANEW,
-- KINDITEMRATE,
KINDRISKRATE,
Insuredsubjectmattercode,
Insuredsubjectmatterdesc,
Covercode,
Covername,
EmployeesClasscode,
EmployeesOccupations,
FACPLANCODE
)SELECT A.POLICYNO ,
'000' ENDORSEQNO,
ETL_FUNC_PACKAGE.GET_GUPOLICYCOPYRISK1(B.POLICYNO,B.ENDORSEQNO,B.RISKCODE,'PLANCODE') PLANCODE,
B.RISKCODE,
C.ITEMNO,
C.ITEMKINDNO,
C.KINDCODE,
C.KINDNAME,
C.ITEMDETAILCODE,
C.ITEMDETAILLIST,
A.MANUALPOLICYNO,
-- ENDORNO,
-- ENDORTYPE,
-- ENDORTYPENAME,
A.BUSINESSTYPE,
ETL_FUNC_PACKAGE.GET_GUPOLICYCOPYRISK1(P_POLICYNO,'000',P_RISKCODE,'RISKCLASS'),
A.INTERMEDIARYCODE,
ETL_FUNC_PACKAGE.GET_AGENTNAME(INTERMEDIARYCODE) INTERMEDIARYCNNAME,
A.AGREEMENTNO,
A.SOLUTIONCODE,
CASE WHEN A.RENEWIND = '0' AND A.ENDORSEQNO = '000' THEN 'N' --新单
WHEN A.RENEWIND = '1' AND A.ENDORSEQNO = '000' THEN 'R' --续保单
WHEN A.ENDORSEQNO != '000' THEN 'E' --批单
END POLICYTYPE,
A.APPLINAME,
A.INSUREDNAME,
TRUNC(B.STARTDATE),
TRUNC(B.ENDDATE),
A.UWYEAR,
NVL(C.GROSSPREMIUM,0),
NVL(C.NETPREMIUM,0),
0 COMMISSIONA,
0 SURCHARGEAMOUNTA,
0 DISCOUNTRATE,
0 COMMISIONRATE,
0 CLIENTDISCOUNTA,
A.UNDERWRITEENDDATE,A.UNDERWRITECODE,
A.SALESMANCODE,A.OPERATORCODE,
ETL_FUNC_PACKAGE.GET_COMPANYCODE(A.COMPANYCODE) COMPANYCODE,
TRUNC(GREATEST(B.STARTDATE,A.UNDERWRITEENDDATE)) ACCOUNTDATE,
TRUNC(A.INPUTDATE),
A.ALLOWRENEWIND,
ETL_FUNC_PACKAGE.GET_COMPANYCODE(A.ISSUECOMPANY) ISSUECOMPANY,
'00' ENDORTYPE,
A.BUSINESSSOURCE,
NVL(C.SUMINSURED,0)*DECODE(C.CALCULATEIND,'1',1,0), -- 不计保额取保额为0
0 LIMITA,
A.COMPANYCODE,
SYSDATE,
a.insuredcode,
A.PROMOTIONCODE,
A.APPLICODE,
ETL_FUNC_PACKAGE.GET_POLICYCOPYREINSCEDEDINFO(P_POLICYNO, '000', 'OUTREINSCODE'),
ETL_FUNC_PACKAGE.GET_POLICYCOPYREINSCEDEDINFO(P_POLICYNO, '000', 'OUTPOLICYNO'),
ETL_FUNC_PACKAGE.GET_POLICYCOPYREINSCEDEDINFO(P_POLICYNO, '000', 'BROKERCODE'),
ETL_FUNC_PACKAGE.GET_POLICYCOPYREINSCEDEDINFO(P_POLICYNO, '000', 'DEBITACCEPTER'),
0, -- A.COINSISSUEEXPENSE,-- TODO
TRUNC(B.STARTDATE) DUESTARTDATE,
A.TRCODE,
ETL_FUNC_PACKAGE.GET_TRNAME(A.TRCODE),
A.SPECIALACCEPTANCE,
A.CURRENCY,
V_EXCHRATE,
GET_GUPOLICYCOPYEMPOLYINFO('OCCUPATION',P_POLICYNO,P_ENDORSEQNO,C.ITEMNO),
GET_GUPOLICYCOPYEMPOLYINFO('OCCUPATIONNAME',P_POLICYNO,P_ENDORSEQNO,C.ITEMNO),
GET_GUPOLICYCOPYEMPOLYINFO('TICCODE',P_POLICYNO,P_ENDORSEQNO,C.ITEMNO),
GET_GUPOLICYCOPYEMPOLYINFO('TICCODENAME',P_POLICYNO,P_ENDORSEQNO,C.ITEMNO),
--SUMGROSSPREMIUMANEW,
--SUMNETPREMIUMANEW,
--COMMISSIONANEW,
--SURCHARGEAMOUNTANEW,
--SUMINSUREDANEW,
--LIMITANEW,
-- 0 KINDITEMRATE,
0 KINDRISKRATE,
GET_GUPOLICYCOPYITEMKINDINFO('INSUREDSUBJECTMATTERCODE',subStr(B.RISKCODE,0,2),P_POLICYNO,P_ENDORSEQNO,B.PLANCODE,B.RISKCODE,C.ITEMKINDNO) Insuredsubjectmattercode,
GET_GUPOLICYCOPYITEMKINDINFO('INSUREDSUBJECTMATTERDESC',subStr(B.RISKCODE,0,2),P_POLICYNO,P_ENDORSEQNO,B.PLANCODE,B.RISKCODE,C.ITEMKINDNO) Insuredsubjectmatterdesc,
GET_GUPOLICYCOPYITEMKINDINFO('COVERCODE',subStr(B.RISKCODE,0,2),P_POLICYNO,P_ENDORSEQNO,B.PLANCODE,B.RISKCODE,C.ITEMKINDNO) Covercode,
GET_GUPOLICYCOPYITEMKINDINFO('COVERNAME',subStr(B.RISKCODE,0,2),P_POLICYNO,P_ENDORSEQNO,B.PLANCODE,B.RISKCODE,C.ITEMKINDNO) Covername,
GET_GUPOLICYCOPYITEMKINDINFO('CLASSCODE',subStr(B.RISKCODE,0,2),P_POLICYNO,P_ENDORSEQNO,B.PLANCODE,B.RISKCODE,C.ITEMKINDNO) EmployeesClasscode,
GET_GUPOLICYCOPYITEMKINDINFO('OCCUPATIONS',subStr(B.RISKCODE,0,2),P_POLICYNO,P_ENDORSEQNO,B.PLANCODE,B.RISKCODE,C.ITEMKINDNO) EmployeesOccupations,
D.PLANCODE
FROM GUPOLICYCOPYMAIN A,GUPOLICYCOPYRISK B,GUPOLICYCOPYITEMKIND C,GRFACPOLICY D
WHERE A.POLICYNO = B.POLICYNO
AND A.ENDORSEQNO = B.ENDORSEQNO
AND A.POLICYNO = C.POLICYNO
AND A.ENDORSEQNO = C.ENDORSEQNO
AND A.POLICYNO = P_POLICYNO
AND B.RISKCODE = C.RISKCODE
AND A.ENDORSEQNO = P_ENDORSEQNO
AND B.RISKCODE = P_RISKCODE
AND C.POLICYNO = D.POLICYNO(+)
AND C.ENDORSEQNO = D.ENDORSEQNO(+)
AND C.ITEMNO=D.DANGERUNITNO(+);
-- 设置险别保额/保费/佣金/征费
FOR REC_KIND IN CUR_KIND LOOP
GET_GUPOLICYCOPYKINDINFO(P_POLICYNO,P_ENDORSEQNO,P_RISKCODE,REC_KIND.ITEMNO,REC_KIND.ITEMKINDNO,V_KINDINFO);
UPDATE DATA_POLICYENDORKINDBASEINFO T
SET T.SUMGROSSPREMIUMA = V_KINDINFO.GROSSPREMIUMKIND * V_EXCHRATE,
T.SUMNETPREMIUMA = V_KINDINFO.NETPREMIUMKIND * V_EXCHRATE,
T.SUMINSUREDA = T.SUMINSUREDA * V_EXCHRATE,
T.COMMISSIONA = V_KINDINFO.COMMISSIONKIND * V_EXCHRATE,
T.CLIENTDISCOUNTA = V_KINDINFO.DISCOUNTKIND * V_EXCHRATE,
T.COMMISIONRATE = V_KINDINFO.COMMISSIONRATE ,
T.DISCOUNTRATE = V_KINDINFO.DISCOUNTRATE,
T.SURCHARGEAMOUNTA = V_KINDINFO.SURCHARGEAMOUNTKIND* V_EXCHRATE ,
T.LIMITA = V_KINDINFO.LIMITKIND * V_EXCHRATE,
T.KINDITEMRATE = V_KINDINFO.KINDITEMRATE,
T.KINDRISKRATE = V_KINDINFO.KINDRISKRATE
WHERE T.ROWID = REC_KIND.ROW_ID;
V_TOTALKINDCOMMISION := V_TOTALKINDCOMMISION + V_KINDINFO.COMMISSIONKIND;
V_TOTALKINDDISCOUNT := V_TOTALKINDDISCOUNT + V_KINDINFO.DISCOUNTKIND;
V_TOTALKINDLIMIT := V_TOTALKINDLIMIT + V_KINDINFO.LIMITKIND;
IF V_RISKCOMMISION = 0 OR V_RISKDISCOUNT = 0 OR V_RISKLIMIT = 0 THEN
V_RISKCOMMISION := V_KINDINFO.COMMISSIONRISK;
V_RISKDISCOUNT := V_KINDINFO.DISCOUNTRISK;
V_RISKLIMIT := V_KINDINFO.LIMITRISK;
END IF;
END LOOP;这是游标内容