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されて実行されます。
関連の記事