SAK 図書館

SAK Streets メインストリート 図書館・カフェ 一覧 SAK Streets 検索
| VB | SQL | Perl | PHP | ASP | JSP | C | PC | HP | FAQ | フリーソフト |

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 編資料
| VB | SQL | Perl | PHP | ASP | JSP | C | PC | HP | FAQ | フリーソフト |

SAK Streets メインストリート 図書館・カフェ 一覧 SAK Streets 検索



Copyright (C) 1999-2017 Y.SAK