2017-01-24 7 views
0

私は2つのテーブルを持っています。それらをTable1とTable2と呼んでいます。 私がという名前の変数があります。roleリストまたはデータセットと同様の作業

は、今私は(複数の行を返すことができます)Table1からselect文を実行する必要があります。

SELECT roles INTO role FROM TABLE1 

そして、私は表2

roleを挿入する必要が
INSERT INTO Table2(RELATION_ID, ROLES) VALUES (maxID+1, role); 

今私の問題は、最初のselectステートメントは2行以上を返すので、role変数に値を入れることができません。だから、これらの値をループして別のテーブルに挿入する必要があるので、値を入れるにはArrayListやDataSetのようなものが必要です。リストを使用してそれをSQL(Oracle)で繰り返すにはどうすればいいですか?

私のコードは、以下のように表示されます。もちろん、コードはコンパイルされず、必要なものを明確にしようとします。ありがとう。

CREATE OR REPLACE PROCEDURE "myProcedure"(eventID IN NUMBER) 
    IS 

    roleNumber NUMBER; 
    maxID NUMBER; 

    BEGIN 
     SELECT roles FROM TABLE1; 
     SELECT MAX(RELATION_ID) INTO maxID FROM SOMEOTHERTABLE; 

    IF maxID IS NULL 
    THEN 
     maxID := 0; 
    END IF; 

    FOR counter IN theListThatINeed  
     INSERT INTO Table2(RELATION_ID, ROLES) VALUES (maxID+1, roleAtCounter); 
    END IF; 

    END "myProcedure" 
+0

あなたRELATION_IDをインクリメントautoにシーケンスとトリガーを使用している場合、解決策は –

答えて

1

コレクションを使用して作業を完了してください。以下を参照してください:

CREATE OR REPLACE PROCEDURE myProcedure (eventID IN NUMBER) 
IS 
    ID_max NUMBER; 

    CURSOR cur 
    IS 
     SELECT roles FROM TABLE1; 

    TYPE x IS TABLE OF cur%ROWTYPE 
     INDEX BY PLS_INTEGER; 

    var  x; 
BEGIN 
    OPEN CUR; 

    FETCH cur BULK COLLECT INTO var; 

    CLOSE cur; 

    SELECT MAX (RELATION_ID) INTO ID_max FROM SOMEOTHERTABLE; 

    IF ID_max IS NULL 
    THEN 
     ID_max := 0; 
    END IF; 

    FOR i IN 1 .. var.COUNT 
    LOOP 
     INSERT INTO Table2 (RELATION_ID, ROLES) 
      VALUES ((ID_max + i), var(i).roles); 
    END LOOP; 

    COMMIT; 
END myProcedure; 
1

私は、これは正確にについて、あなたは求めているではありません知っているが、あなたの問題の解決策がある:いくつかの他のプロセスもtable2に挿入することができますし、あなたが本当にmax(id)あなたが必要な場合は

create sequence seqid start with 1 increment by 1; 
INSERT INTO Table2(RELATION_ID, ROLES) 
    select seqid.nextval, role from table1; 

次のようにすることができます:

with maxid as (select max(id) mid from table2) 
    INSERT INTO Table2(RELATION_ID, ROLES) 
     select mid+rownum, role from table1, maxid; 
2

この状況では、私はただ1つのSQL文を使用します。 SQLエンジンと別の言語との間でコンテキストを前後に切り替える必要はなく、この行を一度に処理する必要はありません。

INSERT INTO Table2(RELATION_ID, ROLES) 
SELECT (SELECT NVL(MAX(RELATION_ID),0) FROM SOMEOTHERTABLE)+rownum, roles 
FROM table1; 
+0

おかげで非常に簡単になります、私はNVL()関数については知りませんでした。 なぜあなたは '+ rownum'を広告しますか、私は従いませんか? –

+1

rownumは、オラクルが自動的に1から多くの行に数値として追加する疑似列です。したがって、最初の行では、結果セット全体のループを模倣し、毎回変数に1を追加するために、1秒に2を追加します。詳細については、http://docs.oracle.com/database/122/SQLRF/ROWNUM-Pseudocolumn.htm#SQLRF00255 – Craig

+0

を参照してください。ありがとうございます。私はまだSQLについて多く学んでいます。だからあなたが '+ rownum'を外したら、あなたはエラーを、あるいはあなたのデータに矛盾を起こすでしょうか? –

関連する問題