C# PLSQLで複数件をinsertする

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されて実行されます。

関連の記事

C# PLSQLのselectで複数件取得する

△上に戻る