C#のPLSQLで複数件をinsertするサンプルです。
C#から配列を渡します。
確認環境 ・Microsoft Visual Studio Community 2019 ・Oracle Express Edition 11g Release 2 ・Oracle.ManagedDataAccess 19.5.0 |
目次
サンプル | PLSQL |
C#のコード |
PLSQL
PLSQLの仕様部
CREATE OR REPLACE PACKAGE TEST_SYAIN_INS
IS
/*
* 配列で登録
*/
TYPE t_id1 IS TABLE OF syain.id%TYPE index by binary_integer;
TYPE t_syainName IS TABLE OF syain.name%TYPE index by binary_integer;
PROCEDURE INS_SYAIN(
IN_ID IN t_id1,
IN_NAME IN t_syainName,
OUT_SQLCODE OUT NUMBER,
OUT_SQLERR OUT VARCHAR2
);
END;
2つの引数を受け取り、SQLコードとエラーメッセージを返します。
6,7行目は、連想配列を宣言しています。%TYPEは、DBのテーブルの項目と同じ型とサイズになります。
10,11行目は、6,7行目で宣言した型で入力される値を受け取ります。
PLSQLの本体部
CREATE OR REPLACE PACKAGE BODY TEST_SYAIN_INS
IS
/*
* 配列で登録
*/
PROCEDURE INS_SYAIN(
IN_ID IN t_id1,
IN_NAME IN t_syainName,
OUT_SQLCODE OUT NUMBER,
OUT_SQLERR OUT VARCHAR2
)
IS
BEGIN
DELETE FROM SYAIN;
--FOR i IN 1..IN_ID.COUNT LOOP
FOR i IN IN_ID.first..IN_ID.last LOOP
INSERT INTO syain VALUES (IN_ID(i),IN_NAME(i),'romaji');
END LOOP;
commit;
EXCEPTION
WHEN OTHERS THEN
OUT_SQLCODE := SQLCODE; --正常終了時は0
OUT_SQLERR := SQLERRM; --エラー情報
rollback;
END INS_SYAIN;
END;
14行目は、一旦テーブルのデータをDeleteで削除しています。
17から19行目は、取得した配列の数分ループ処理をしてInsert文を実行しています。
16行目の書き方でも可能です。添字の最初は1から始まります。
20行目は、commitで処理を確定させます。
22行目以降は、例外発生時に実行されます。
24行目のSQLCODEは、正常終了時は0が入ります。
25行目のSQLERRMは、エラー情報が入ります。
26行目は、rollbackでロールバック処理を行います。
C#のコード
using System;
using System.Data;
using Oracle.ManagedDataAccess.Client;
using System.Collections.Generic;
class Test1
{
static void Main()
{
var ar1 = new[] { "1", "2", "3" }; //配列
var ar2 = new[] { "鈴木", "田中", "佐藤" }; //配列
try
{
using (OracleConnection conn = new OracleConnection())
{
conn.ConnectionString =
"User ID=hr; Password=hr; Data Source=localhost/XE";
conn.Open();
using (OracleCommand cmd = new OracleCommand())
{
cmd.Connection = conn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "TEST_SYAIN_INS.INS_SYAIN";
var syainId = new OracleParameter(
"IN_ID", OracleDbType.Decimal);
syainId.CollectionType =
OracleCollectionType.PLSQLAssociativeArray;
syainId.Direction = ParameterDirection.Input;
syainId.Value = ar1;
syainId.Size = ar1.Length;
cmd.Parameters.Add(syainId);
var syainName = new OracleParameter(
"IN_NAME", OracleDbType.Varchar2);
syainName.CollectionType =
OracleCollectionType.PLSQLAssociativeArray;
syainName.Direction = ParameterDirection.Input;
syainName.Value = ar2;
syainName.Size = ar2.Length;
cmd.Parameters.Add(syainName);
cmd.Parameters.Add(new OracleParameter(
"OUT_SQLCODE", OracleDbType.Decimal)
).Direction = ParameterDirection.Output;
cmd.Parameters.Add(new OracleParameter(
"OUT_SQLERR", OracleDbType.Varchar2)
).Direction = ParameterDirection.Output;
cmd.ExecuteNonQuery();
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message.ToString());
}
}
}
10,11行目は、配列です。
16,17行目は、接続情報です。User Idとパスワードとデータソースを指定しています。
18行目は接続です。
23行目は接続先のPLSQLを指定しています。
24行目からは、送信する値です。
27行目は、PLSQLAssociativeArrayを指定しています。Associative Array=連想配列です。
29行目は、配列をvalueにセットしています。
44,47行目は、受信する値です。SQLCODEとSQLERRを指定しています。
50行目は、ExecuteNonQueryメソッドで実行しています。
54行目は、例外が発生したときにcatchされて実行されます。
関連の記事