• ベストアンサー

VBからoo4o接続でストアドを呼ぶ方法

お世話になります、 VBからoo4o接続でストアドを呼ぶ方法を探しています。 <現在の状況> ■ストアドパッケージ ・次のように値を返すストアドパッケージがあるとします。これを CreatePLSQLDynaset で実行して、レコードセットを取得します。(OraDynaset) create or replace package testp is procedure GetTestm(key in number, cu out CHAR); end; / create or replace package body testp is procedure GetTestm(key in number,cu out CHAR) is begin select NAME into cu from TEMP where STATUS=key; end; end; / ■VBのボタンイベント Private Sub Command1_Click() Dim dbname Dim cnuser '** サービス、ユーザ設定 dbname = "aaa" cnuser = "bb/bb" '** oo4o 接続 Set GoORASESSION = CreateObject("OracleInProcServer.XOraSession")  Set GoORADATABASE = GoORASESSION.OpenDatabase(dbname, cnuser, &H0) '** リクエリレコードセットオープン Set Recordset = GoORADATABASE.CreatePLSQLDynaset("Begin testp.GetTestm (1,:cu); end;", "cu", &H0) End Sub これを実行したところ以下のようなエラーが出ました <エラー> ____________________________ 実行時エラー '440' SQL実行エラー,ORA-06550:行:1、列:7 PLS-00306:'GETTESTM'の呼び出しで、引数の数または型が正しくありません ORA-06550:行:1、列:7 PL/SQL:Statement ignored _______________________________ というエラーが出てしまいます、引数の数は合っていると思うのですが、どこがお菓子のでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • masabou7
  • ベストアンサー率18% (2/11)
回答No.6

以下にサンプルをご提供します。参考にして下さい。 尚、関数の詳細は、oo4oを使用するVBの専門書か又は、Webで調べて下さい。 ' Oracleに接続 Set OraSession = CreateObject("OracleInProcServer.XOraSession") Set OraDatabase = OraSession.DbOpenDatabase("cims", "test/test", 0&) 'パラメータの型 Const ORAPARM_INPUT = 1 Const ORAPARM_OUTPUT = 2 Const ORAPARM_BOTH = 3 Const ORATYPE_VARCHAR2 = 1 Const ORATYPE_NUMBER = 2 ' SQL実行に使用するVB変数 Dim v_sqlstmt As String Dim v_retcode As Integer 'パラメータのバインド OraDatabase.Parameters.Add "P1", "", ORAPARM_INPUT OraDatabase.Parameters("P1").serverType = ORATYPE_VARCHAR2 OraDatabase.Parameters("P1").Value = "1" OraDatabase.Parameters.Add "P2", "", ORAPARM_INPUT OraDatabase.Parameters("P2").serverType = ORATYPE_NUMBER OraDatabase.Parameters("P2").Value = "1" OraDatabase.Parameters.Add "P3", "", ORAPARM_OUTPUT OraDatabase.Parameters("P3").serverType = ORATYPE_NUMBER OraDatabase.Parameters("P3").MinimumSize = 2 'PL/SQLブロックからプロシージャを呼ぶ v_sqlstmt = "begin test.main(:P1, :P2, :P3); end;" v_retcode = OraDatabase.ExecuteSQL(v_sqlstmt) ' 返り値を表示 MsgBox OraDatabase.Parameters("P1").Value MsgBox OraDatabase.Parameters("P2").Value MsgBox OraDatabase.Parameters("P3").Value 'パラメータリストからパラメータを削除 OraDatabase.Parameters.Remove "P1" OraDatabase.Parameters.Remove "P2" OraDatabase.Parameters.Remove "P3"

その他の回答 (5)

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.5

よく見ると[cu]も使用してますねだからストアドの受けにINが必要でした。 ストアドをあんまり見てませんでした・・・ いつもCreatePLSQLDynasetを使用しないで、CreateSqlを使用していたので、結構推測部分が多いアドバイスになってしまいました。 あと GoORADATABASE.Parameters.Add "key", 1, ORAPARM_INPUT ですが、パラメータに1を渡すという意味です。 ですので、 "Begin testp.GetTestm (1,:cu); end;", "cu", &H0 の1を "Begin testp.GetTestm (:key,:cu); end;", "cu", &H0 と変更しました。 環境がないと、正確な事が言えませんね。。。 以後気をつけます。。。m(__)m

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.4

1.http://www.fukkey.dyndns.org/pins/search/search.htmlで「くるくるおらくる会議室」で調べる 2.hyu_yaさんの言われたようにサンプルを見る 3.エクスローラのアドレスバーに [Search CreatePLSQLDynaset VB]などと打ちこんで、ネット全体をMSNで検索する いろいろな調べ方がありますよ。

  • hyu_ya
  • ベストアンサー率17% (3/17)
回答No.3

パラメータ(引数)の設定がされてないようですが・・・ 以前、自分も似たような?(その時はVBAでしたが)事が有り 調べてみると身近なところ(自分の端末に!) OO4Oが入っているんですよね?であれば、 [スタート]→[プログラム]→[OracleForWindows xx] →[Oracle Objects for OLE X.X Documentation]より 「パラメータ」とか「ADDメソッド」で検索すると サンプルが載ってます!! 既に知っていて、それでも・・・という場合はごめんなさい。<m(__)m>

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.2

追記です。 定数を書くのを忘れてました。 Const ORAPARM_INPUT = 1 Const ORAPARM_OUTPUT = 2 Const ORAPARM_BOTH = 3 Const ORATYPE_VARCHAR2 = 1 Const ORATYPE_NUMBER = 2 Const ORATYPE_SINT = 3 Const ORATYPE_FLOAT = 4 Const ORATYPE_STRING = 5 Const ORATYPE_VARCHAR = 9 Const ORATYPE_DATE = 12 Const ORATYPE_UINT = 68 Const ORATYPE_CHAR = 96 Const ORATYPE_CHARZ = 97

noname#1752
質問者

補足

ストアドを以下のように書き直したところうまくいきました <改良したストアド> create or replace package testp as cursor c1 is select * from TEMP; type testmcu is ref cursor return c1%rowtype; procedure GetTestm(key in varchar2, cu in out testmcu); end; / create or replace package body testp is procedure GetTestm(key in varchar2, cu in out testmcu) is begin open cu for select * from TEMP where STATUS = TO_NUMBER(key); end; end; / 質問であげているストアドは何がいけなかったんでしょうか?

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.1

オラクル環境が、今無いので未検証です。。。 '** DBセット Set GoORADATABASE = GoORASESSION.OpenDatabase(dbname, cnuser, &H0) '** パラメータセット GoORADATABASE.Parameters.Add "key", 1, ORAPARM_INPUT GoORADATABASE.Parameters("key").ServerType = ORATYPE_NUMBER GoORADATABASE.Parameters.Add "cu", 0, ORAPARM_OUTPUT GoORADATABASE.Parameters("cu").ServerType = ORATYPE_CHAR '** リクエリレコードセットオープン Set Recordset = GoORADATABASE.CreatePLSQLDynaset("Begin testp.GetTestm (:key,:cu); end;", "cu", &H0)

noname#1752
質問者

補足

パラメタセットを行っても同じエラーが出てしまいます、 ちなみに GoORADATABASE.Parameters.Add "key", 1, ORAPARM_INPUT の「1」とは何を意味しているのでしょうか? VBの関数一覧みたいな情報ってどこで見ればいいのでしょうか?