0

PLSQLで問題が発生したので、ここで助けが得られることを願っています。2つのテーブルがあります。最初のテーブルはtest1と呼ばれ、2つの列(customer_idとmsisdn)があり、2つのレコードがあります。もう1つはtest_histと呼ばれ、customer_id、msisdn、seqnoの3つの列があり、1つのレコードがあります。「seqno」はシーケンス番号です。挿入されたすべてのレコードは、1だけ大きいseqno番号を取得します。私が書いたスクリプトは次のとおりです。

宣言する

CURSOR test IS
SELECT * FROM test1; 


CUSTOMER_ID NUMBER;
MSISDN NUMBER;
V_SEQNO NUMBER;

始める

    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;

終わり;

問題は、それを実行した後、これが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つ)に挿入されます。使用している元のテーブルには400kレコードがあるため、単純な挿入ステートメントをいくつか実行することはできません。...(:TOADを使用している場合、環境はORACLE8です。

私が欠けているものは何ですか?

アサフ、どうもありがとう。

4

1 に答える 1

0

シーケンスを使用できます。その後、データを挿入するためにpl /sqlブロックは必要ありません。単純な挿入で実行できます。それ以外の場合は、デュアルまたは値を指定してpl/sqlを使用します。

宣言する

CURSORテストはSELECT*FROMtest1です。

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;
于 2012-12-17T13:04:05.513 に答える