fc2ブログ

(元)社内SEの徒然なる日記

oo4oでExcelから登録してみた(ExecuteSQL)

登録・更新・削除

今回は、oo4oを使用してDML文(Insert、Update、Delete)を実行してみます。
oo4oから、これらのSQLを実行するにはExecuteSQLメソッドを使用する方法と、CreateSQLメソッドを使用する方法があります。

今回は、ExecuteSQLメソッドを使用してみます。

サンプルソース

配列myTblの内容を、TESTDBテーブルに登録(Insert)するサンプルです。

' データ登録サンプル(ExecuteSQL:バインド変数なし)
'
Sub insertTestExecuteSQLNotBind()

'--------------
' 変数宣言
'--------------

'SQL文
Dim mySql As String

'登録データ
Dim myTbl(2, 1) As String '登録用データ配列
Dim myInd As Integer 'カウンタ

'oo4o用のオブジェクト
Dim OO4OSession As Object
Dim EmpDb As Object
Dim sqlStatement As Object

'実行時情報
Dim myCount As Long

'-----------------
' 初期処理
'-----------------

'登録用のデータ作成
myTbl(0, 0) = "A": myTbl(0, 1) = 1
myTbl(1, 0) = "B": myTbl(1, 1) = 2
myTbl(2, 0) = "C": myTbl(2, 1) = 3

'-----------------
' DB接続
'-----------------

'更新用のDB接続
Set OO4OSession = CreateObject("OracleInProcServer.XOraSession")
Set EmpDb = OO4OSession.OpenDatabase(ORA_DBSTRING, ORA_USERNAME & "/" & ORA_PASSWD, 0&)

'-----------------
' データ登録
'-----------------

'Insert文の実行
For myInd = LBound(myTbl) To UBound(myTbl)

'INSERT文作成
mySql = ""
mySql = mySql & " INSERT INTO "
mySql = mySql & " TESTDB (TESTSTR,TESTNUM)"
mySql = mySql & " VALUES "
mySql = mySql & " ("
mySql = mySql & "'" & CStr(myTbl(myInd, 0)) & "'"
mySql = mySql & CInt(myTbl(myInd, 1))
mySql = mySql & " )"

'Insert文を実行
myCount = myCount + EmpDb.ExecuteSQL(mySql)

Next

'-----------------
' 終了処理
'-----------------

'終了メッセージの表示
MsgBox "正常終了!" & Chr(10) & Chr(10) & "登録件数:" & myCount

'オブジェクトの開放
Set sqlStatement = Nothing
Set EmpDb = Nothing
Set OO4OSession = Nothing

End Sub


サンプルの解説

1. 変数宣言、初期処理、DB接続

DB接続までの処理は、事前準備なので省略です。
OraDatabaseオブジェクトの作成で使用しているORA_DBSTRING、ORA_USERNAME、ORA_PASSWDには、必要な接続情報が定義されているとします。

2. データ登録

変数mySqlにSQL文(Insert文)を設定して、ExecuteSQLメソッドでSQLを実行します。
これを配列の件数分実行します。

ExecuteSQLメソッドは、処理された行数を返します。
これを使用して登録件数をカウントしています。

3. 終了処理

ExecuteSQLメソッドの戻値から取得した登録件数を表示して、使用したオブジェクトを解放します。

バインド変数を使用するサンプル

これだけだとつまらないので、バインド変数を使用したサンプルも作りました。

' データ登録サンプル(ExecuteSQL:バインド変数あり)
'
Sub insertTestExecuteSQL()

'--------------
' 変数宣言
'--------------

'SQL文
Dim mySql As String

'登録データ
Dim myTbl(2, 1) As String '登録用データ配列
Dim myInd As Integer 'カウンタ

'oo4o用のオブジェクト
Dim OO4OSession As Object
Dim EmpDb As Object
Dim sqlStatement As Object

'実行時情報
Dim myCount As Long

'-----------------
' 初期処理
'-----------------

'INSERT文作成
mySql = ""
mySql = mySql & " INSERT INTO "
mySql = mySql & " TESTDB (TESTSTR,TESTNUM)"
mySql = mySql & " VALUES (:ADDSTR, :ADDNUM)"

'登録用のデータ作成
myTbl(0, 0) = "A": myTbl(0, 1) = 1
myTbl(1, 0) = "B": myTbl(1, 1) = 2
myTbl(2, 0) = "C": myTbl(2, 1) = 3

'-----------------
' DB接続
'-----------------

'更新用のDB接続
Set OO4OSession = CreateObject("OracleInProcServer.XOraSession")
Set EmpDb = OO4OSession.OpenDatabase(ORA_DBSTRING, ORA_USERNAME & "/" & ORA_PASSWD, 0&)

'バインド変数の設定
EmpDb.Parameters.Add "ADDSTR", CStr(myTbl(0, 0)), 1
EmpDb.Parameters("ADDSTR").ServerType = 1 'ORATYPE_VARCHAR2

EmpDb.Parameters.Add "ADDNUM", CInt(myTbl(0, 1)), 1
EmpDb.Parameters("ADDNUM").ServerType = 2 'ORATYPE_NUMBER

'-----------------
' データ登録
'-----------------

'Insert文の実行
For myInd = LBound(myTbl) To UBound(myTbl)

'バインド変数の再設定
EmpDb.Parameters("ADDSTR").Value = CStr(myTbl(myInd, 0))
EmpDb.Parameters("ADDNUM").Value = CInt(myTbl(myInd, 1))

'Insert文を実行
myCount = myCount + EmpDb.ExecuteSQL(mySql)

Next

'-----------------
' 終了処理
'-----------------

'終了メッセージの表示
MsgBox "正常終了!" & Chr(10) & Chr(10) & "登録件数:" & myCount

'オブジェクトの開放
Set sqlStatement = Nothing
Set EmpDb = Nothing
Set OO4OSession = Nothing

End Sub


変更箇所

1. SQL文の作成

SQL文の作成を初期処理で行います。
この時に、VALUESの値にはバインド変数を定義しておきます。

2. バインド変数の初期設定
Addメソッドで、OraParametersコレクションにパラメータを追加します。
第一引数には、SQL文の作成時に設定したバインド変数を設定。
第二引数には、パラメータの初期値を設定しておきます。
第三引数には、1(入力変数)を設定します。

次に、ServerTypeプロパティにバインド変数のデータ型を設定します。
VARCHAR2の場合は 1 を、NUMBERの場合は 2 を設定します。
他の型の場合、下記のように設定する...ようです。
実は、VARCHAR2とNUMBERしか試してないんですよね。

3:SIGNED INTEGER
4:FLOAT
5:NULLで終了するSTRING
9:VARCHAR
12:DATE
68:UNSIGNED INTEGER
95:RAW
96:CHAR
97:NULLで終了するCHAR
105:MLSLABEL
108:OBJECT
110:REF
112:CLOB
113:BLOB
114:BFILE
247:VARRAY
248:NESTED TABLE
2000:RAW


3. ExecuteSQL
後は、バインド変数に設定する値を変えながらExecuteSQLメソッドを実行するだけです。
毎回SQLを作り直すより、こちらの方がシンプルですね。

補足

oo4oの場合、初期設定は自動コミットのようです。
今回のサンプルで言えば、ExecuteSQLメソッドを発行するたびにコミットが実行されています。


前回:oo4oによる抽出件数の考察
次回:oo4oでExcelから登録してみた(CreateSQL)
投稿記事の一覧:目次

--- blog end ---

スポンサードリンク

PageTop

コメント


管理者にだけ表示を許可する