Oracleの機能にArrayBindがあります。
ストアードなどの PL/SQの列パラメータに配列を渡せる機能です。
ID 名字 価格
--------------------------
1 木村 102
10 那賀側 104
15 北側 155
20 甲村 1443
30 高騰 225
40 抜粋 545
50 鈍伝 445
このような3列でn行からなるデータを登録するとき、行ごとにInsert文を発行すると、7回Insert文を発行するのは、冗長です。バルクインサートなどの方法もありますが、もっと手軽に早く実行できる仕組みとして、 ArrayBind機能があります。
CREATE OR REPLACE PROCEDURE 挿入(a_id NUMBER, a_A VARCHAR2 ,a_B number)
IS BEGIN
INSERT INTO TBL (id, A, B) VALUES (a_id,a_A, a_B);
END;
というストアードを登録しておいて、
各列を1つの配列化してパラメータ登録して
cmd.ArrayBindCount = DT.Rows.Count
cmd.CommandText = "挿入"
cmd.CommandType = CommandType.StoredProcedure
Dim i As Integer = cmd.ExecuteNonQuery()
とするだけで処理してくれます。
cmd.ArrayBindCount = 配列.Length ここで、要素数をセットするだけです。
速度は、体感ですが、クライアントでLoopした時と比べると、数倍以上早いです。
早い上に、ソースもすっきり書けます。
ところが、ほとんど、知られていなくて、周知徹底するのに、画策しないとイケないのは、チト悲し感が有りました。
知っているだろうと独断するのでなく、些細なとでも、便利機能と思うことは、声に出して、叫んだほうが良いみたい。
「そんなこと知っているよ」と言われそうなことでも、「知らなかった」と言われる確率が結構高いことに今更吃驚しています。
このストアードを、拡張して、PK項目で判定して、なければ挿入、有れば更新という風に、すれば、もっと使い手がよくなりそうに思います。 Merge文は使う前段の処理がチト面倒なので、反応は今一でした。