OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

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

  • 困ってます
  • 質問No.167919
  • 閲覧数2971
  • ありがとう数4
  • 気になる数0
  • 回答数6
  • コメント数0

お世話になります、

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
_______________________________

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

よろしくお願いします。
通報する
  • 回答数6
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.6
レベル6

ベストアンサー率 18% (2/11)

以下にサンプルをご提供します。参考にして下さい。
尚、関数の詳細は、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"
-PR-
-PR-

その他の回答 (全5件)

  • 回答No.1
レベル12

ベストアンサー率 65% (276/422)

オラクル環境が、今無いので未検証です。。。 '** DBセット Set GoORADATABASE = GoORASESSION.OpenDatabase(dbname, cnuser, &H0) '** パラメータセット GoORADATABASE.Parameters.Add "key", 1, ORAPARM_INPUT GoOR ...続きを読む
オラクル環境が、今無いので未検証です。。。


'** 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の関数一覧みたいな情報ってどこで見ればいいのでしょうか?
投稿日時 - 2001-11-14 09:45:38


  • 回答No.2
レベル12

ベストアンサー率 65% (276/422)

追記です。 定数を書くのを忘れてました。 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 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;
/

質問であげているストアドは何がいけなかったんでしょうか?
投稿日時 - 2001-11-14 10:06:19
  • 回答No.3
レベル7

ベストアンサー率 17% (3/17)

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

ベストアンサー率 65% (276/422)

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

いろいろな調べ方がありますよ。
  • 回答No.5
レベル12

ベストアンサー率 65% (276/422)

よく見ると[cu]も使用してますねだからストアドの受けにINが必要でした。 ストアドをあんまり見てませんでした・・・ いつもCreatePLSQLDynasetを使用しないで、CreateSqlを使用していたので、結構推測部分が多いアドバイスになってしまいました。 あと GoORADATABASE.Parameters.Add "key", 1, ORAPARM_INPUT ...続きを読む
よく見ると[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
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ