VB.NET PLSQLで複数件をinsertする

VB.NET PLSQLで複数件をinsertするサンプルです。
VB.NETから配列を渡します。
(確認環境:Microsoft Visual Studio Community 2019,Oracle Express Edition 11g)

目次

サンプル PLSQL
  VB.NETのコード

PLSQL

PLSQLの仕様部

CREATE OR REPLACE PACKAGE TEST_employee_INS
IS
/*
*  配列で登録
*/
TYPE t_id1       IS TABLE OF employee.id%TYPE index by binary_integer;
TYPE t_employeeName IS TABLE OF employee.name%TYPE index by binary_integer;

PROCEDURE INS_employee(
IN_ID     IN  t_id1,
IN_NAME   IN  t_employeeName,
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_employee_INS
IS
/*
*  配列で登録
*/
PROCEDURE INS_employee(
  IN_ID IN t_id1,
  IN_NAME IN t_employeeName,
  OUT_SQLCODE OUT NUMBER,
  OUT_SQLERR  OUT VARCHAR2
)
IS
BEGIN
  DELETE FROM employee;

  --FOR i IN 1..IN_ID.COUNT LOOP
  FOR i IN IN_ID.first..IN_ID.last LOOP
    INSERT INTO employee 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_employee;
END;

14行目は、一旦テーブルのデータをDeleteで削除しています。
17から19行目は、取得した配列の数分ループ処理をしてInsert文を実行しています。
16行目の書き方でも可能です。添字の最初は1から始まります。
20行目は、commitで処理を確定させます。
22行目以降は、例外発生時に実行されます。
24行目のSQLCODEは、正常終了時は0が入ります。
25行目のSQLERRMは、エラー情報が入ります。
26行目は、rollbackでロールバック処理を行います。

VB.NETのコード

Imports Oracle.ManagedDataAccess.Client

Module Module1
	Sub Main()
		Dim ar1() As String = {"1", "2", "3"} '配列
		Dim ar2() As String = {"鈴木", "田中", "佐藤"} '配列
		Try
			Using conn As New OracleConnection()
				conn.ConnectionString =
						"User Id=hr;Password=hr;Data Source=localhost/XE;"
				conn.Open()
				Using cmd = New OracleCommand()
					cmd.Connection = conn
					cmd.CommandType = CommandType.StoredProcedure
					cmd.CommandText = "TEST_employee_INS.INS_employee"

					Dim employeeId As OracleParameter = New OracleParameter(
						"IN_ID", OracleDbType.Decimal)
					employeeId.CollectionType =
					OracleCollectionType.PLSQLAssociativeArray
					employeeId.Direction = ParameterDirection.Input
					employeeId.Value = ar1
					employeeId.Size = ar1.Length

					cmd.Parameters.Add(employeeId)

					Dim employeeName As OracleParameter = New OracleParameter(
						"IN_NAME", OracleDbType.Varchar2)
					employeeName.CollectionType =
						OracleCollectionType.PLSQLAssociativeArray
					employeeName.Direction = ParameterDirection.Input
					employeeName.Value = ar2
					employeeName.Size = ar2.Length

					cmd.Parameters.Add(employeeName)

					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()
				End Using
			End Using
		Catch ex As Exception
			Console.WriteLine(ex.Message)
		End Try
	End Sub
End Module

5,6行目は、配列です。
9,10行目は、接続情報です。User Idとパスワードとデータソースを指定しています。
11行目は接続です。
15行目は接続先のPLSQLを指定しています。
17行目からは、送信する値です。
20行目は、PLSQLAssociativeArrayを指定しています。Associative Array=連想配列です。
22行目は、配列をvalueにセットしています。

37,40行目は、受信する値です。SQLCODEとSQLERRを指定しています。
43行目は、ExecuteNonQueryメソッドで実行しています。
46行目は、例外が発生したときにcatchされて実行されます。

関連の記事

VB.NET Oracleに接続してselectするサンプル
VB.NET PLSQLのselectで複数件取得する

△上に戻る