SAK 図書館
ASP VB Script oo4o + SQL 応用編8 oo4o レコード参照 - CreateDynaset
oo4o は、Oracle RDBMS でみ使用可能です。 ■リクエリ概念 リクエリと言うのは、キーを変更してのレコードセット参照など、オープンし たままのレコードセットのクエリ再実行のことです。 oo4o の場合は、RDO や ADO の「?」の代わりにバインド変数で処理します。 ■CreateDynaset 定数 (カーソル指定含む) OraDynaset Public Const ORADYN_DEFAULT = &H0 Public Const ORADYN_NO_AUTOBIND = &H1 Public Const ORADYN_NO_BLANKSTRIP = &H2 Public Const ORADYN_READONLY = &H4 Public Const ORADYN_NOCACHE = &H8 Public Const ORADYN_ORAMODE = &H10 Public Const ORADYN_DBDEFAULT = &H20 Public Const ORADYN_NO_MOVEFIRST = &H40 Public Const ORADYN_DIRTY_WRITE = &H80 ■単純オープン '** レコードセット変数宣言 Dim rs '** レコードセットオープン set rs = session("OraDatabase").CreateDynaset("select * from sak.テストm " _ & " where 抽出条件 order by ソート順", ORADYN_DEFAULT) '** レコード処理 'ここに操作コードが入る '** レコードセットクローズ set rs = Nothing ■クエリオープン '** クエリ、レコードセット変数宣言 Dim rs '** パラメタ追加 session("OraDatabase").Parameters.Add "キー", 0, ORAPARM_INPUT session("OraDatabase").Parameters("キー").ServerType = ORATYPE_CHAR '** レコードセットオープン set rs = session("OraDatabase").CreateDynaset("select * from sak.テストm " _ & " where キー = :キー", ORADYN_DEFAULT) '** リクエリ session("OraDatabase").Parameters("キー").value = "a001" rs.Refresh '** レコード処理 'ここに操作コードが入る '** レコードセットクローズ set rs = Nothing '** パラメタ解消 session("OraDatabase").Parameters.Remove "キー" クエリオープンでは、rs.Refresh で、レコードセットの内容が最新になる。 また、バインド変数『:バインド変数名』による文字埋め込みも可能である。 (パラメタには『'』を指定する必要なし。) パラメタクエリをリクエリする場合は、 session("OraDatabase").Parameters("キー").value = 'a001' rs.Refresh の様にパラメタをセット後にリクエリをかける。 ■補足 ・現実的なコードでは、必ずエラートラップ処理を行うこと!! ■レコード操作命令(レコード移動、カーソル移動) rs.MoveFirst (先頭レコード) rs.MovePrevious (前のレコード) rs.MoveNext (次のレコード) rs.MoveLast (最終レコード) rs.Refresh (リクエリ) set rs = Nothing (レコードセットクローズ) rs.CopyToClipboard (クリップボードコピー) ■レコードチェック rs.EOF (TRUE のとき、前方レコードなし。) rs.BOF (TRUE のとき、後方レコードなし。) ■レコード数(照会件数、問い合わせ件数、検索件数、抽出件数、データ件数) rs.RecordCount ■ブックマーク rs.Bookmark (現在行) rs.LastModified (edit、addnew にり最後に変更された行) ■レコード項目参照 rs("項目名") ← rs!項目名は ASP では使用できない。 ■レコード全件処理 do until rs.EOF '1 レコード毎の処理 rs.MoveNext loop ■フィールドプロパティ (フィールド関連情報取得) OraFields rs.Fields.Count (フィールド数) rs(field).OralDataType (Oracle データ型) rs(field).OraMaxDSize (文字最大サイズ) rs(field).OraMaxSize (最大サイズ) rs(field).OraNullOK (NULL OK か) rs(field).OraPrecision (数値精度) rs(field).OraScale (数値位取り) rs(field).Name (フィールド名) rs(field).Size (サイズ) rs(field).Type (VB データ型) rs(field).Value (値) デフォルトプロパティ rs(field) ** rs("キー").Name、または、rs(0).Name のようにする。 ■使いたくないメソッド rs.AddNew (レコード追加開始) rs.Edit (レコード編集開始) rs.Delete (レコード削除) rs.Update (レコード更新) rs.Clone (レコード複製) rs.FindFirst (先頭検索) rs.FindLast (最終検索) rs.FindNext (次検索) rs.FindPrevious (前検索) rs.MoveNextn (n 行次へ) rs.MovePrevionsn (n 行前へ) rs.MoveRel (n 行移動) rs.MoveTo (n 行へ移動) ** レコードセット編集(rs.edit、rs.addnew) は、リモート RDB の場合、 Execute の方が高速です。(レコード変更、レコード修正) ■使いたくないプロパティ rs.EditMode (編集状態) rs.Updatable (編集可能) rs.NoMatch (find でノーマッチのとき TRUE) rs.Options (オブションフラグ値) ■varray、object フィールドアクセス ・詳しくは、次の資料を参照して下さい。 Oracle PL/SQL 編3 - コレクション、table、varray、宣言、コレクションメソッド '** varray 型 Dim item As OraCollection Do Until rs.EOF Print rs(0) Print rs(1) Set item = rs.Fields("adre").Value For i = 1 To item.Size Print i & " - " & item(i) Next rs.MoveNext Loop '** object 型 Dim item As OraObject Do Until rs.EOF Print rs(0) Print rs(1) Set item = rs.Fields("adre").Value For i = 1 To item.Count Print i & " - " & item(i) Next rs.MoveNext Loop ■現実的なコード例 <%@ Language=VBScript %> <% '======================================================================= ' 準備 '======================================================================= Public Const ORADB_DEFAULT = &H0 Public Const ORADYN_DEFAULT = &H0 Public Const ORADYN_NO_AUTOBIND = &H1 Public Const ORADYN_NO_BLANKSTRIP = &H2 Public Const ORADYN_READONLY = &H4 Public Const ORADYN_NOCACHE = &H8 Public Const ORADYN_ORAMODE = &H10 Public Const ORADYN_DBDEFAULT = &H20 Public Const ORADYN_NO_MOVEFIRST = &H40 Public Const ORADYN_DIRTY_WRITE = &H80 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 '** パラメタ追加 if isempty(session("ParaAdd")) then session("OraDatabase").Parameters.Add "キー", 0, ORAPARM_INPUT session("OraDatabase").Parameters("キー").ServerType = ORATYPE_CHAR if err <> 0 or session("OraDatabase").LastServerErr <> 0 then response.write("<P>パラメタ追加に失敗しました。<BR>" _ & err & ": " & error & "<BR>" _ & "oo4o: " & session("OraDatabase").LastServerErrText & "</P>") else session("ParaAdd") = true end if end if '** リクエリレコードセットオープン if isempty(session("qurs")) then set session("qurs") = session("OraDatabase").CreateDynaset("select * from sak.テストm " _ & " where キー = :キー", ORADYN_DEFAULT) if err <> 0 or session("OraDatabase").LastServerErr <> 0 then response.write("<P>リクエリレコードセットオープンに失敗しました。<BR>" _ & err & ": " & error & "<BR>" _ & "oo4o: " & session("OraDatabase").LastServerErrText & "</P>") end if end if '** エラートラップ終了 on error goto 0 '======================================================================= ' 処理 '======================================================================= '---- 単純オープンテスト ---- response.write("<P>-- 単純オープンテスト --</P>") '** レコードセット変数宣言 Dim rs '** レコードセットオープン set rs = session("OraDatabase").CreateDynaset("select * from sak.テストm " _ & " where キー like 'a%' order by キー", ORADYN_DEFAULT) '** レコード処理 do until rs.EOF response.write(rs("キー") & "<BR>") rs.MoveNext loop '** レコードセットクローズ set rs = Nothing '---- クエリオープンテスト ---- response.write("<P>-- クエリオープンテスト --</P>") '** リクエリ session("OraDatabase").Parameters("キー").value = "a001" session("qurs").Refresh if session("qurs").EOF then response.write("a001 not found") else response.write(session("qurs")("キー") & "<BR>") end if '** リクエリ session("OraDatabase").Parameters("キー").value = "b002" session("qurs").Refresh if session("qurs").EOF then response.write("b002 not found") else response.write(session("qurs")("キー") & "<BR>") end if response.write("<P>-- 終了 --</P>") %> ■説明 ・session("qurs") を作る CreateDynaset は、パラメタを先に追加してから 実行しないと、バインドエラーで session("qurs") が作成できない。 ■like でのバインド変数使用注意点 ・like でバインド変数を使用する場合、「%」が構文エラーになる。 「%」を含めたい場合は、次のように「|| '%'」と指定する。 Set qurs = OraDatabase.CreateDynaset("select * from sak.テストm " _ & " where キー like :キー || '%'", ORADYN_DEFAULT) ・この場合は、バインド変数へのデータセットでは「%」を既に指定している ので、次のように省く。 OraDatabase.Parameters("キー").Value = "a" ・like でバインド変数を使用する場合、「%」を後で指定するなら、単純に 次のようにする。 Set qurs = OraDatabase.CreateDynaset("select * from sak.テストm " _ & " where キー like :キー", ORADYN_DEFAULT) ・この場合は、バインド変数へのデータセット時に「%」も含めて、次のよう に指定する。 OraDatabase.Parameters("キー").Value = "a%" ■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 編資料