2012-12-17 63 views
0

我在PLSQL上遇到了一個問題,希望我能在這裏得到一些幫助。 我有2個表 - 第一個稱爲test1,並有2列 - customer_id和msisdn,並有2個記錄。 另一個被稱爲test_hist並有3列 - customer_id,msisdn和seqno並有1條記錄。 「seqno」是序號。每一個創紀錄的inseted得到的SeqNo數是高出1 我寫的腳本是:在腳本中插入

DECLARE

CURSOR test IS 
SELECT * FROM test1; 


CUSTOMER_ID NUMBER; 
MSISDN NUMBER; 
V_SEQNO NUMBER; 

BEGIN

FOR a IN test LOOP 

     SELECT MAX(SEQNO)+1 INTO V_SEQNO FROM test1_hist; 

     INSERT INTO test1_hist 
     select a.CUSTOMER_ID ,v_seqno, a.msisdn 
     from test1; 
    END LOOP; 
    commit; 

END;

的問題是,它運行後,這是我得到test_hist表:

CUSTOMER_ID SEQNO MSISDN 

1.55443322 3 5422112 
1.55443322 3 5422112 
1.12232323 2 5454554 
1.12232323 2 5454554 
1.22211444 1 544643330 

運行相同倍的記錄數。 如果我在test1表上有4條記錄,它會插入到test_hist 16(每條記錄的總數爲4)。 原始表IM與工作有40萬條記錄,所以我不能只是做一些簡單的插入語句....(: IM使用蟾蜍,該environement是ORACLE 8

任何想法,我失去了什麼

非常感謝 阿薩夫。

+0

這是什麼語言和環境?看起來像SQL,但你能更精確嗎? – arkascha

+0

ORACLE 8上的PLSQL。 – Shlomix

+0

感謝您添加該信息。抱歉,沒有經驗。 – arkascha

回答

0

你可以使用序列..then沒有必要爲PL/SQL塊插入data..can在簡單的插入完成...其他明智的使用PL/SQL用雙重或值

DECLARE

CURSOR測試IS SELECT * FROM test1;

CUSTOMER_ID NUMBER; 
MSISDN NUMBER; 
V_SEQNO NUMBER; 
BEGIN 

    FOR a IN test LOOP 

     SELECT MAX(SEQNO)+1 INTO V_SEQNO FROM test1_hist; 

     INSERT INTO test1_hist 
     select a.CUSTOMER_ID ,v_seqno, a.msisdn 
     from dual; 
    END LOOP; 
    commit; 
+0

謝謝!它現在一切都好! – Shlomix

+0

我AM實際上試着瞭解如何雙工作,特別是在這個例子 – Shlomix

+0

嗨Shlomix, 問題是,如果你試圖插入每個值到表test1_hist多少次在test1表.... 請運行像 這樣的查詢從test1中選擇''; 這將返回''與test1中的列數一樣多。 但是,當涉及到雙...它將只返回行。 舉例運行這個查詢select * from dual;這將返回只有單行... 這就是爲了循環在PL/SQL和插入單個值,那麼你應該使用插入 values()子句或插入從雙選擇值; – GKV