SAK 図書館
ASP VB Script oo4o + SQL 応用編6 oo4o 更新 - CreateSql
oo4o は、Oracle RDBMS でみ使用可能です。
■CreateSql での更新
・CreateSql でもバインド変数を使用した更新ができる。
■session("OraSQLStmt") メソッド
session("OraSQLStmt").Refresh (リクエリ)
Set session("OraSQLStmt") = Nothing (session("OraSQLStmt") 破棄)
■session("OraSQLStmt") プロパティ
session("OraSQLStmt").RecordCount (処理件数)
■CreateSql 定数
Public Const ORASQL_DEFAULT = &H0
Public Const ORASQL_NO_AUTOBIND = &H1
Public Const ORASQL_FAILEXEC = &H2
■現実的なコード例
<%@ Language=VBScript %>
<%
'=======================================================================
' 準備
'=======================================================================
Public Const ORADB_DEFAULT = &H0
Public Const ORASQL_DEFAULT = &H0
Public Const ORASQL_NO_AUTOBIND = &H1
Public Const ORASQL_FAILEXEC = &H2
Public Const ORAPARM_INPUT = 1
Public Const ORAPARM_OUTPUT = 2
Public Const ORAPARM_BOTH = 3
Public Const ORATYPE_VARCHAR2 = 1
Public Const ORATYPE_NUMBER = 2
Public Const ORATYPE_SINT = 3
Public Const ORATYPE_FLOAT = 4
Public Const ORATYPE_STRING = 5
Public Const ORATYPE_VARCHAR = 9
Public Const ORATYPE_DATE = 12
Public Const ORATYPE_UINT = 68
Public Const ORATYPE_CHAR = 96
Public Const ORATYPE_CHARZ = 97
Public Const ORATYPE_CURSOR = 102
dim dbname
dim cnuser
'** エラートラップ開始
on error resume next
'** サービス、ユーザ設定
dbname = ""
cnuser = "SAK/SAK"
'// Oracle サービス名(別名)、ユーザ・パスワード指定
'** oo4o 接続
if isempty(session("OraSession")) then
Set session("OraSession") = Server.CreateObject("OracleInProcServer.XOraSession")
if err <> 0 then
response.write("<P>データベースに接続出来ません。<BR>" _
& "CreateObject - Oracle oo4o エラー</P>")
end if
end if
if isempty(session("OraDatabase")) then
Set session("OraDatabase") = session("OraSession").OpenDatabase(dbname, cnuser, ORADB_DEFAULT)
if err <> 0 then
response.write("<P>データベースに接続出来ません。<BR>" _
& err & ": " & error & "</P>")
end if
end if
'** SQL 作成
if isobject(session("OraSQLStmt")) = false then
Set session("OraSQLStmt") = session("OraDatabase").CreateSql("insert into sak.テストm " _
& "(キー, データ1, データ2, データ3) values " _
& "(:キー, :データ1, :データ2, :データ3)", ORASQL_DEFAULT)
if session("OraDatabase").LastServerErr = 1008 then session("OraDatabase").LastServerErrReset
if err <> 0 or session("OraDatabase").LastServerErr <> 0 then
response.write("<P>SQL 作成に失敗しました。<BR>" _
& err & ": " & error & "<BR>" _
& "oo4o: " & session("OraDatabase").LastServerErrText & "</P>")
end if
end if
'** パラメタ追加
session("OraDatabase").LastServerErrReset
if isempty(session("Pkey")) then
session("OraDatabase").Parameters.Add "キー", 0, ORAPARM_INPUT
session("OraDatabase").Parameters("キー").ServerType = ORATYPE_CHAR
set session("Pkey") = session("OraDatabase").Parameters("キー")
end if
if isempty(session("Pdata1")) then
session("OraDatabase").Parameters.Add "データ1", 0, ORAPARM_INPUT
session("OraDatabase").Parameters("データ1").ServerType = ORATYPE_NUMBER
set session("Pdata1") = session("OraDatabase").Parameters("データ1")
end if
if isempty(session("Pdata2")) then
session("OraDatabase").Parameters.Add "データ2", 0, ORAPARM_INPUT
session("OraDatabase").Parameters("データ2").ServerType = ORATYPE_NUMBER
set session("Pdata2") = session("OraDatabase").Parameters("データ2")
end if
if isempty(session("Pdata3")) then
session("OraDatabase").Parameters.Add "データ3", 0, ORAPARM_INPUT
session("OraDatabase").Parameters("データ3").ServerType = ORATYPE_NUMBER
set session("Pdata3") = session("OraDatabase").Parameters("データ3")
end if
if err <> 0 or session("OraDatabase").LastServerErr <> 0 then
response.write("<P>パラメタ追加に失敗しました。<BR>" _
& err & ": " & error & "<BR>" _
& "oo4o: " & session("OraDatabase").LastServerErrText & "</P>")
end if
'** エラートラップ終了
on error goto 0
'=======================================================================
' 処理
'=======================================================================
'** RDB 処理
if RdbShori() then
response.write("<P>-- RDB 更新正常終了 --</P>")
end if
'=======================================================================
' RDB 処理
'=======================================================================
function RdbShori()
'** エラーセット
RdbShori = FALSE
'** エラートラップ開始
on error resume next
'** oo4o エラーリセット
session("OraDatabase").LastServerErrReset
'** トランザクション開始
session("OraSession").BeginTrans
'** RDB 処理1
session("Pkey").Value = "a001"
session("Pdata1").Value = 10
session("Pdata2").Value = 20
session("Pdata3").Value = 30
session("OraSQLStmt").Refresh
if err <> 0 or session("OraDatabase").LastServerErr <> 0 then
session("OraSession").Rollback
response.write("<P>RDB 更新1 に失敗しました。<BR>" _
& err & ": " & error & "<BR>" _
& "oo4o: " & session("OraDatabase").LastServerErrText & "</P>")
exit function
end if
'** RDB 処理2
session("Pkey").Value = "b002"
session("Pdata1").Value = 100
session("Pdata2").Value = 200
session("Pdata3").Value = 300
session("OraSQLStmt").Refresh
if err <> 0 or session("OraDatabase").LastServerErr <> 0 then
session("OraSession").Rollback
response.write("<P>RDB 更新2 に失敗しました。<BR>" _
& err & ": " & error & "<BR>" _
& "oo4o: " & session("OraDatabase").LastServerErrText & "</P>")
exit function
end if
'** トランザクション終了
session("OraSession").CommitTrans
'** エラートラップ終了
on error goto 0
'** 正常セット
RdbShori = TRUE
end function
%>
■説明
・if session("OraDatabase").LastServerErr = 1008 then session("OraDatabase").LastServerErrReset
は、SQL を作るだけに使用した CreateSQL のバインドエラーをリセット。
先にパラメタを追加するとエラーにならないが、SQL が実行されてしまう。
・CreateSql の session("OraSQLStmt") は、isempty() が set 後も true で
ある。従って、if isobject(session("OraSQLStmt")) = false then で、
初期創成を判定している。
■ASP VB Script oo4o + SQL 応用編資料
■ASP VB Script ADO + SQL 応用編資料
■ASP VB Script 基礎実地編資料
■ASP VB Script 基礎編資料
■SQL 基礎編資料
■SQL 基礎実地編資料
■SQL チューニング編資料
■Oracle PL/SQL 編資料
■PostgreSQL 編、JAVA Servlet、JSP 編資料
■MySQL 編資料