create or replace procedure test as
cursor carddata is select distinct g from cfsj;
str varchar2(100);
mark number(1);
begin
for x in carddata loop
str :='';
mark:=1;
for y in (select k from cfsj t where t.g = x.g) loop
if mark=1 then
str := y.k;
mark:=2;
end if;
str := str || ',' || y.k;
end loop;
delete from cfsj t1 where rowid !=(select max(rowid) from cfsj t2 where t1.g=t2.g) and t1.g=x.g;
update cfsj set k=str where g=x.g;
end loop;
end;
好慢哦
uj5u.com熱心網友回復:
表結構貼一下,包含索引情況。 只有這個程序,沒什么判斷依據。uj5u.com熱心網友回復:
雙重回圈 本來就不快uj5u.com熱心網友回復:
create table CFSJ
(
a VARCHAR2(1000),
b VARCHAR2(1000),
c VARCHAR2(1000),
d VARCHAR2(1000),
e VARCHAR2(1000),
f VARCHAR2(1000),
g VARCHAR2(1000),
h VARCHAR2(1000),
i VARCHAR2(1000),
j VARCHAR2(1000),
k VARCHAR2(1000),
l VARCHAR2(1000),
m VARCHAR2(1000),
n VARCHAR2(1000)
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
uj5u.com熱心網友回復:
g 列加一個索引。uj5u.com熱心網友回復:
你的回圈里面套回圈,為什么不在外面的回圈里面加一次commit呢,你這樣的結果最終要有N多的undo占用,而且還費時間uj5u.com熱心網友回復:
create or replace procedure test ascursor carddata is select distinct g from cfsj;
str varchar2(100);
mark number(1);
begin
for x in carddata loop
str :='';
mark:=1;
for y in (select k from cfsj t where t.g = x.g) loop
if mark=1 then
str := y.k;
mark:=2;
end if;
str := str || ',' || y.k;
end loop;
delete from cfsj t1 where rowid !=(select max(rowid) from cfsj t2 where t1.g=t2.g) and t1.g=x.g;
update cfsj set k=str where g=x.g;
end loop;
end;
這個程序的意思是 只取cfsj 表里按g分組的最大rowid , 并將所有K列欄位按分組拼接吧 是不是G列有空值?再或者表資料量過大,如果資料量過大 可以在使用臨時表, 存放最大列rowid的行記錄并加工資料 然后truncate原表, 最后將零時表資料插進物體表
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/53984.html
標籤:開發
上一篇:我的pl/sql登陸不上去?ora-12569:TNS:包檢驗和失敗。請大神們指教!!!!
下一篇:oracle 監聽服務無法啟動
