2014-04-04 18 views
0

我正在学习PL/SQL并编写了一个我已经粘贴到下面的PL/SQL块。 该块按预期运行,但需要花费大量时间来完成该过程。 为了检查我跑了两个表中的10条记录,它花了4分钟。 之后,我试图在大量数据上运行它,即使在5小时后也没有完成。 任何人都可以请指导我什么问题在这里,以及如何我可以提高性能。下面是我的PL/SQL块。执行大量时间的PL/SQL块

编辑:在更新查询的client_trans_vk1的client_id上没有创建索引。这是罪魁祸首吗?

DECLARE 
v_client_id test_vk.client_id%TYPE; 
v_trans_amount account_bal.Bal_Am%TYPE; 

cursor c_client 
is select client_id,TRANS_AM as transaction_amount from test_vk; 

begin 
    OPEN c_client; 
    LOOP 
    FETCH c_client INTO v_client_id,v_trans_amount; 
    BEGIN 
    EXIT WHEN c_client%NOTFOUND; 
    update client_trans_vk1 ca 
     set ca.bal_amt = 0, ca.additional_AM = (ca.additional_AM + v_trans_amount) 
     where ca.client_id = v_client_id; 
    commit; 
    END; 
    end LOOP; 
    CLOSE c_client 
end; 

回答

1

有没有从LOOP语句退出,我很惊讶它甚至工作,它基本上循环
无限的最后一行。你需要退出循环,你从游标读取之后的所有行,像这样:

DECLARE 
v_client_id test_vk.client_id%TYPE; 
v_trans_amount account_bal.Bal_Am%TYPE; 

cursor c_client 
is select client_id,TRANS_AM as transaction_amount from test_vk; 

begin 
    OPEN c_client; 
    LOOP 
    FETCH c_client INTO v_client_id,v_trans_amount; 
    EXIT WHEN c_client%NOTFOUND; 
    BEGIN 
    update client_trans_vk1 ca 
     set ca.bal_amt = 0, ca.additional_AM = (ca.additional_AM + v_trans_amount) 
     where ca.client_id = v_client_id; 
    commit; 
    END; 
    end LOOP; 
    CLOSE c_client 
end; 
+1

的OP没有说*“它并没有完成,即使5小时后,” * :) –

+0

感谢米哈伊尔和杰弗里。我确实有退出声明。在SO编辑问题时,它被误删了。但遗憾的是问题仍然存在:( – vikeng21

+0

Mikhail我接受你的答案。我有EXIT语句,但它不在FETCH和BEGIN之间,但BEGIN之后。谢谢指出它。反正我也创建索引client_id在client_trans_vk1表,你会惊讶于我的PL/SQL块在9.27秒内执行.... :)。反正杰弗里如果我能我也会upvoted你。 – vikeng21