SQLStoredProcde


さと  2003-05-14 03:56:21  No: 3524

はじめまして。
早速ですが教えて下さい。

環境は、Delphi7  +  Oracle9iで
リモートデータモジュールを使用してソケット接続の3層アプリを作成しています。

構成は以下になっています。
(1層  DBサーバー)
      Oracle
        |
----------------------------
(2層  アプリサーバ)
    SQLConnection
        |
    SQLStoredProc
        |
    DataSetProvider
        |
        |(ソケット接続)
        |
----------------------------
(3層  クライアント)
    SocketConnection
        |
    ClientDataSet

基本的なDBの参照や更新処理などは行えています。
今回、ストアドを利用したく、SQLStoredProcを配置しました。
しかし、ストアドにOUTパラメータを設定するとエラーが(不正なパラメータ)
でて正常に動作しません。
(INパラメータだけなら正常に行える)

ソースは以下です。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
------ストアド本文------
CREATE OR REPLACE PROCEDURE PROC_TABLESET2(
  pi_vcName      IN  VARCHAR2,
  pi_nAge        IN  NUMBER,
  po_vcErrMsg    OUT VARCHAR2
)AS

BEGIN
  po_vcErrMsg := '成功!';
  Insert Into Test(namd, age)Values(pi_vcName, pi_nAge);
  COMMIT;

EXCEPTION
  WHEN OTHERS THEN BEGIN
    po_vcErrMsg := '失敗!';
    ROLLBACK;
  END;
END;

------Delphiソース------
procedure TForm1.Button6Click(Sender: TObject);
begin
  try
    with DataModule.ClientDataSet do begin
      Close;
      FetchParams;
      Params.ParamByName('pi_vcName').AsString := Edit1.Text;
      Params.ParamByName('pi_nAge').AsInteger := StrToInt(Edit2.Text);
      Execute;
      ShowMessage(Params.ParamByName('po_vcErrMsg').Value);
    end;
  finally
  end;
end;

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
当然、CelientDataSetのRemoteServerプロパティには対応するRemoteServerを設定し、
ProviderNameにも対応するProviderNameを設定しており、各コンポーネントの関連づけは間違いなく行われています。
「Execute」を「Open」に変えてみたりもしたのですが駄目でした。
TSQLCOnnectionの代わりにTDataBaseを利用し、
SQLStoredProcの代わりにStoredProcを利用し、その他の各種設定は変えない場合は動作します。
あと、多層でなく単層(DataSetProviderやCelinetDataSetを使用しない)で行う場合も正常に動作しました。

どこかが間違ってるんでしょうが、わかりません。
どなたかわかる方教えていただけないでしょうか?
よろしくお願いします。

※言葉が足りなくてわかりずらいかもしれませんがよろしくお願いします。


にしの  2003-05-14 06:24:17  No: 3525

Executeする直前の、Params.ParamByName('po_vcErrMsg')はどうなっていますか?
ParamTypeはptOutputになっていますか。
ptOutputとptResult  で、動作が違うかもしれません。
もしかしたら、FetchParamsが間違ってOUTを設定しているのかも・・・。
# こちらに環境がないので確かめられません

それとも、単にVariantとして扱おうとしているからエラーでしょうかね。
Params.ParamByName('po_vcErrMsg').AsStringでもだめですか?


さと  2003-05-14 20:08:57  No: 3526

>Executeする直前の、Params.ParamByName('po_vcErrMsg')はどうなっていますか?
Executeする前に、Params.ParamByName('po_vcErrMsg')の値はさわっていません。
>ParamTypeはptOutputになっていますか。
>ptOutputとptResult で、動作が違うかもしれません。
ParamTypeはptOutputになっています。試しにptOutputとptResult でやってみましたが駄目でした。
>Params.ParamByName('po_vcErrMsg').AsStringでもだめですか?
やってみたのですが駄目でした。
FetchParamsをはずしたりしてみましたがやっぱりうまくいきません。

もうちょっと色々がんばってみます。
また何かわかりましたらよろしくお願いします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加