C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: VBSにてストアド実行時「文字列バッファが小さすぎます」


(過去ログ 125 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■74773 / inTopicNo.1)  VBSにてストアド実行時「文字列バッファが小さすぎます」
  
□投稿者/ ヤマモトヤマ (1回)-(2015/01/28(Wed) 17:35:35)

分類:[VBScript] 

お世話になります。

Windows 2012 R2 + Oracle 12c にて開発しています。

VBSにてOracleのストアドを実行したいのですが、パラメータ箇所の記載が間違っているらしく
実行時に「ORA-06502: PL/SQL: 数値または値のエラー: 文字列バッファが小さすぎます」のエラーが発生します。

以下にソースを記載します

Set objADO = CreateObject("ADODB.Connection")
  objADO.Open "DSN=XXXX; UID=XXXX; PWD=XXXX;" 
	If Err.Number <> 0 Then
		Call Log("データベースへの接続に失敗しました。バッチ処理を中断します: " & Err.Description)
	Else
		Call Log("データベースへ接続しました")
	End If
'ストアドの実行準備
              Set OBJdbCommand = CreateObject("ADODB.Command")             
              SET OBJdbCommand.ActiveConnection = objADO
              OBJdbCommand.CommandText = "ストアド名"
              OBJdbCommand.CommandType =4
              '戻り値
              Set Param1 = OBJdbCommand.CreateParameter("VALUE1",3,4)
              OBJdbCommand.Parameters.Append Param1
             'OUT値
              Set Param3 = OBJdbCommand.CreateParameter("OUTVAL1",129,2,200,"")
              OBJdbCommand.Parameters.Append Param3
              
              'IN値
              Set Param2 = OBJdbCommand.CreateParameter("INVAL1",129,1,200,"12")
              OBJdbCommand.Parameters.Append Param2
           

              objRS= OBJdbCommand.Execute   ←ここでエラー


●呼び出すストアドファンクション

FUNCTION 対象ファンクション名(
	INVAL1		IN	VARCHAR2,
	OUTVAL1		OUT	VARCHAR2
)RETURN NUMBER IS
begin 

処理コード
Return 1
End


●試したこと
 Set Param3 = OBJdbCommand.CreateParameter("OUTVAL1",129,2,200,"")

 Set Param2 = OBJdbCommand.CreateParameter("INVAL1",129,1,200,"12")

これらのパラメータ指定を129(adChar)→200(adVarChar)に変更
サイズの「200」を大きな数字「9999999」

などを試してみましたが同様のエラーでした。
返り値の取得などは考えずひとまずストアドが動作すればいいのですが、対応策を
ご存じの方がいればよろしくお願いします。



引用返信 編集キー/
■74779 / inTopicNo.2)  Re[1]: VBSにてストアド実行時「文字列バッファが小さすぎます」
□投稿者/ しま (95回)-(2015/01/28(Wed) 19:12:26)
No74773 (ヤマモトヤマ さん) に返信
> お世話になります。
>
> Windows 2012 R2 + Oracle 12c にて開発しています。
>
> VBSにてOracleのストアドを実行したいのですが、パラメータ箇所の記載が間違っているらしく
> 実行時に「ORA-06502: PL/SQL: 数値または値のエラー: 文字列バッファが小さすぎます」のエラーが発生します。
>
関数(ファンクション)の内部での実行中にエラーが発生している可能性はありませんか?
関数呼び出しの引数の渡し方の問題なのか、関数の実行中に例外が発生しているのかのどちらなのか調べてみては如何でしょうか?

一番簡単なのは、処理プログラムのない以下のような関数にして VBA から呼び出してみる
begin
OUTVAL := 'OK';
return 1;
end;

それから、関数側の引数の型が varchar2 なのだから渡す方もそれに見合った型をを指定すべきと思います。
引用返信 編集キー/
■74781 / inTopicNo.3)  Re[2]: VBSにてストアド実行時「文字列バッファが小さすぎます」
□投稿者/ ヤマモトヤマ (2回)-(2015/01/28(Wed) 20:31:18)
No74779 (しま さん) に返信
> ■No74773 (ヤマモトヤマ さん) に返信
>>お世話になります。
>>
>>Windows 2012 R2 + Oracle 12c にて開発しています。
>>
>>VBSにてOracleのストアドを実行したいのですが、パラメータ箇所の記載が間違っているらしく
>>実行時に「ORA-06502: PL/SQL: 数値または値のエラー: 文字列バッファが小さすぎます」のエラーが発生します。
>>
> 関数(ファンクション)の内部での実行中にエラーが発生している可能性はありませんか?
> 関数呼び出しの引数の渡し方の問題なのか、関数の実行中に例外が発生しているのかのどちらなのか調べてみては如何でしょうか?
>
> 一番簡単なのは、処理プログラムのない以下のような関数にして VBA から呼び出してみる
> begin
> OUTVAL := 'OK';
> return 1;
> end;
>
> それから、関数側の引数の型が varchar2 なのだから渡す方もそれに見合った型をを指定すべきと思います。

返信有難うございます。
まず
> 一番簡単なのは、処理プログラムのない以下のような関数にして VBA から呼び出してみる
こちらの方を確認してみました。
最初に記載していたコードのコマンドテキストだけ変更して実行したところエラーは発生しませんでした。
ストアドのほうで適当なワークテーブルにIN値を書きだしてみたところ、IN値が正しくわたっておらず空白のままになっていることが確認できました。

ただ、ファンクションではなく簡単なプロシージャを作成し、パラメータをIN値一つにしてみたところ、IN値が正常にわたっていました。
原因はパラメータの書き方(OUT値と返り値あたり)かと思うのですが、まだ解決しておりません。


> それから、関数側の引数の型が varchar2 なのだから渡す方もそれに見合った型をを指定すべきと思います。
こちらの方はパラメータのタイプが200(adVarChar)がVarchar2にも対応しているかと思って試していたのですが
変化は見られませんでした。



引用返信 編集キー/
■74783 / inTopicNo.4)  Re[3]: VBSにてストアド実行時「文字列バッファが小さすぎます」
□投稿者/ しま (96回)-(2015/01/29(Thu) 00:14:38)
No74781 (ヤマモトヤマ さん) に返信
> ■No74779 (しま さん) に返信
> 返信有難うございます。
> まず
>>一番簡単なのは、処理プログラムのない以下のような関数にして VBA から呼び出してみる
> こちらの方を確認してみました。
> 最初に記載していたコードのコマンドテキストだけ変更して実行したところエラーは発生しませんでした。
> ストアドのほうで適当なワークテーブルにIN値を書きだしてみたところ、IN値が正しくわたっておらず空白のままになっていることが確認できました。
>
> ただ、ファンクションではなく簡単なプロシージャを作成し、パラメータをIN値一つにしてみたところ、IN値が正常にわたっていました。
> 原因はパラメータの書き方(OUT値と返り値あたり)かと思うのですが、まだ解決しておりません。

VBAのプログラムで、関数に渡す引数を作るところで、引数の渡す順番が食い違っていることにお気づきですか?
戻り値、OUT_引数, IN_引数 の順に引数を渡していますが、
関数側では IN_引数、OUT_引数 の順にわたるようになっていますね?

引数の名前で値が渡る様になっていないなら、渡した順番で引数をやり取りすることはご存知でしょうか?
引用返信 編集キー/
■74789 / inTopicNo.5)  Re[4]: VBSにてストアド実行時「文字列バッファが小さすぎます」
□投稿者/ ヤマモトヤマ (3回)-(2015/01/29(Thu) 10:45:40)
しまさん
返信有難うございます。
> VBAのプログラムで、関数に渡す引数を作るところで、引数の渡す順番が食い違っていることにお気づきですか?
> 戻り値、OUT_引数, IN_引数 の順に引数を渡していますが、
> 関数側では IN_引数、OUT_引数 の順にわたるようになっていますね?
>
> 引数の名前で値が渡る様になっていないなら、渡した順番で引数をやり取りすることはご存知でしょうか?

こちらの内容が原因でした。
戻り値を最初に記載しないといけないようなので、
戻り値、IN値、OUT値
の順で記載することで思っていた動作になりました。有難うございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -