お世話になります、
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
_______________________________
というエラーが出てしまいます、引数の数は合っていると思うのですが、どこがお菓子のでしょうか?
よろしくお願いします。
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"
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
No.4
- 回答日時:
1.
http://www.fukkey.dyndns.org/pins/search/search. …で「くるくるおらくる会議室」で調べる2.hyu_yaさんの言われたようにサンプルを見る
3.エクスローラのアドレスバーに [Search CreatePLSQLDynaset VB]などと打ちこんで、ネット全体をMSNで検索する
いろいろな調べ方がありますよ。
No.3
- 回答日時:
パラメータ(引数)の設定がされてないようですが・・・
以前、自分も似たような?(その時はVBAでしたが)事が有り
調べてみると身近なところ(自分の端末に!)
OO4Oが入っているんですよね?であれば、
[スタート]→[プログラム]→[OracleForWindows xx]
→[Oracle Objects for OLE X.X Documentation]より
「パラメータ」とか「ADDメソッド」で検索すると
サンプルが載ってます!!
既に知っていて、それでも・・・という場合はごめんなさい。<m(__)m>
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
この回答への補足
ストアドを以下のように書き直したところうまくいきました
<改良したストアド>
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;
/
質問であげているストアドは何がいけなかったんでしょうか?
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)
この回答への補足
パラメタセットを行っても同じエラーが出てしまいます、
ちなみに
GoORADATABASE.Parameters.Add "key", 1, ORAPARM_INPUT
の「1」とは何を意味しているのでしょうか?
VBの関数一覧みたいな情報ってどこで見ればいいのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 実行時エラー´5854´ 文字列型パラメーターが長すぎます。 3 2023/06/08 21:17
- Access(アクセス) アクセス テーブルの空白を変数に置換するボタンが作りたい 4 2022/07/08 11:19
- Visual Basic(VBA) 【VBAエラー】Nextに対するForがありません 対策について 5 2022/11/21 21:26
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- Visual Basic(VBA) IBM Notes9のメールをExcelVBAにて送信するコードについての質問です。 以下のコードを 3 2023/06/21 17:58
- Visual Basic(VBA) Excel vbaについての質問 3 2023/04/18 16:14
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Excel(エクセル) EXCEL マクロで行を挿入して貼り付けようとするとエラーになる。 2 2022/05/24 09:43
- PHP php テーブルが作成できない 1 2022/11/17 23:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
実行時エラー 438になった時の...
-
エクセルエラー13型が一致しま...
-
マクロについて教えてください...
-
ExcelVBA Range クラスの Page...
-
なぜこんな初歩的なVBAのIf文で...
-
実行時エラー -'-2147417848
-
VBSで変数の宣言はできないので...
-
なぜエラーになるのでしょうか...
-
ADODB.Streamを使用してUTF-8を...
-
VBA 別シートのセルから、文字...
-
VBAがブレークモードになっ...
-
実行時エラー3001「引数が間違...
-
ExcelVBAで、ユーザー定義型は...
-
AccessVBAでExcelを起動し、罫...
-
【Excel VBA】マクロをボタンに...
-
Excelで下記のようにマクロを作...
-
VBS実行時エラー オブジェクト...
-
日本語環境下で作成したマクロ...
-
VBで構造体を使うさ際の64k...
-
C#でプロパティをもつ構造体型...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
実行時エラー 438になった時の...
-
エクセルエラー13型が一致しま...
-
【Excel VBA】マクロをボタンに...
-
実行時エラー -'-2147417848
-
マクロについて教えてください...
-
VBAがブレークモードになっ...
-
なぜこんな初歩的なVBAのIf文で...
-
実行時エラー3001「引数が間違...
-
OLEDB.NETで接続できない
-
ExcelVBA Range クラスの Page...
-
EXCEL VBAマクロ中断でデバッグ...
-
ADODB.Streamを使用してUTF-8を...
-
VBS実行時エラー オブジェクト...
-
Outlook.ApplicationをCreateOb...
-
VBSで変数の宣言はできないので...
-
VB6+SQL サーバー 2000 で 実行...
-
なぜエラーになるのでしょうか...
-
VBAでのエラー
-
Application.ActiveInspectorで...
-
Excelで下記のようにマクロを作...
おすすめ情報