プロが教える店舗&オフィスのセキュリティ対策術

お世話になります、

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
_______________________________

というエラーが出てしまいます、引数の数は合っていると思うのですが、どこがお菓子のでしょうか?

よろしくお願いします。

A 回答 (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"
    • good
    • 0

よく見ると[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
    • good
    • 0

1.

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

いろいろな調べ方がありますよ。
    • good
    • 0

パラメータ(引数)の設定がされてないようですが・・・


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

追記です。


定数を書くのを忘れてました。

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;
/

質問であげているストアドは何がいけなかったんでしょうか?

補足日時:2001/11/14 10:06
    • good
    • 0

オラクル環境が、今無いので未検証です。

。。


'** 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の関数一覧みたいな情報ってどこで見ればいいのでしょうか?

補足日時:2001/11/14 09:45
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!