SAK 図書館

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

VB ADO + SQL 応用編 (その四) ADO ストアドファンクション - CreateParameter

基本的に Oracle、SQL-Sever、MDB で共通です。

■ストアドファンクション / ストアドプロシジャ

  例えば、Oracle に次のようなストアドファンクションがあるとします。
  (VB で言うユーザ関数のようなもの)
  これを ADO で呼びたし、戻り値を得ることが可能です。

/*
========================================================================
  テンポラリテーブル番号取得 Copyright (C) 1999-2000 Y.SAK
========================================================================
*/

create or replace function sak.GetTmp return varchar2 is
  todt char(10);
  dt char(10);
  no number(9);
  tmp varchar2(20);
  cid integer;
begin
  todt := to_char(sysdate, 'yyyy.mm.dd');
  select 日付 into dt from sak.TMPm;
  if todt > dt then
    update sak.TMPm set 番号 = 0, 日付 = todt;
  end if;
  update sak.TMPm set 番号 = 番号 + 1;
  select 番号 into no from sak.TMPm;
  commit;
  tmp := 'tmp' || ltrim(to_char(no, '000000'));
  begin
    cid := DBMS_SQL.OPEN_CURSOR;
    DBMS_SQL.PARSE(cid, 'drop table ' || tmp, dbms_sql.v7);
    DBMS_SQL.CLOSE_CURSOR(cid);
  exception
    when OTHERS then
      DBMS_SQL.CLOSE_CURSOR(cid);
  end;
  return tmp;
end;
/

■テンポラリテーブル取得ストアドファンクション呼び出し(一時テーブル、一時表)

  ▼フォームグローバル宣言で必要な数のテンポラリテーブル取得変数を宣言し
    ます。ワークt と言うのがそれです。

  Const TMP_SCM = "sak."
  Const GetTmp = TMP_SCM & "GetTmp"
  Dim ワークt As String

  ▼フォーム初期化ルーチンで、実際に使用可能なテンポラリテーブル名を取得
    しています。複数個必要な場合は、s3cn_cmd.Execute からを複数書きます。
    ストアドファンクションの実行は、Microsoft が Oracle 用に提供している
    ドライバでないと動作しない。

Private Sub Form_Load()

  Dim s3cn_cmd
  Dim p0, p1
  Dim rcd As String

'** テンポラリテーブル名取得
  set s3cn_cmd = CreateObject ("ADODB.Command")
  s3cn_cmd.ActiveConnection = s3cn_ado
  s3cn_cmd.commandtext = GetTmp
  s3cn_cmd.commandtype = 4
  set p0 = s3cn_cmd.createParameter("rcd", 200, 4, 9)
  'set p1 = s3cn_cmd.createParameter("p1", 200, 1, 20, "")
  s3cn_cmd.Parameters.Append p0
  's3cn_cmd.Parameters.Append p1
  'p1.Value = "a001"
  s3cn_cmd.execute
  rcd = p0.value
  ワークt = TMP_SCM & rcd

  ▼フォーム破棄ルーチンで、使用したテンポラリテーブルを削除します。
    テスト時、残しておきたいなら、drop table の行を注釈にします。

Private Sub Form_Unload(Cancel As Integer)

'** テンポラリテーブル削除
  if ワークt <> "" then
    On Local Error Resume Next
    s3cn_ado.Execute "drop table " & ワークt
    On Local Error GoTo 0
end if

■補足

  ・Oracle の場合、Oracle のネイティブ ODBC ドライバでは、ストアドファン
    クションが正常に呼び出せません。さんざん悩んだので要注意です。
    Microsoft ODBC for Oracle ドライバでストアドファンクションは呼び出し
    て下さい。

■CommandType

  s3cn_cmd.CommandType = 1   'adCmdText          SQL
  s3cn_cmd.CommandType = 2   'adCmdTable         テーブル
  s3cn_cmd.CommandType = 512 'adCmdTableDirect   テーブル
  s3cn_cmd.CommandType = 4   'adCmdStoredProc    ストアドプロシジャ
  s3cn_cmd.CommandType = 8   'adCmdUnknown       不明(デフォルト)
  s3cn_cmd.CommandType = 256 'adCmdFile          永続化 Recordset
  s3cn_cmd.CommandType = ?   'adExecuteNoRecords 行を返さないコマンド

■VB ADO + SQL 応用編資料
■VB RDO + SQL 応用編資料
■VB oo4o + SQL 応用編資料
■SQL 基礎編資料
■SQL 基礎実地編資料
■SQL チューニング編資料
■Oracle PL/SQL 編資料
■PostgreSQL 編、JAVA Servlet、JSP 編資料
■MySQL 編資料
■VB 入門編資料
■VB 基礎編資料
■VB ビジュアル編資料
■VB テクニック編資料
| VB | SQL | Perl | PHP | ASP | JSP | C | PC | HP | FAQ | フリーソフト |

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



Copyright (C) 1999-2017 Y.SAK