オラクルのストアドを実行するには?

解決


fujiken  2008-12-01 19:39:10  No: 32753

お世話になっております。
ADOStoredProcを使って、テキストボックスに入力した顧客番号を、
ストアドへ渡し顧客名を取得する単純なものなのですが、
下記のエラーが出て困っています。
ご教授お願いできませんでしょうか。

環境:
Delphi2005
Oracle10g
WinXp

■エラーメッセージ
ORA-06550: 行1、列7:
PLS-00306: 'FNCCUSTNAME_GET'の呼び出しで、引数の数または型が正しくありません。
ORA-06550: 行1、列7:
PL/SQL: Statement ignored.

■ストアド
CREATE OR REPLACE FUNCTION fncCustName_Get(param_cust_no IN customer.cust_no%TYPE)
RETURN VARCHAR2
AS
  ret_cust_name customer.cust_name%TYPE;
BEGIN
  select cust_name into ret_cust_name 
  from customer
  where cust_no = param_cust_no;

RETURN(ret_cust_name);

EXCEPTION
  when no_data_found then
    RETURN(-1);

END fncCustName_Get;
/

■SQL*Plusで実行すると
set serveroutput on

declare
  disp_cust_name varchar2(48);
begin
  disp_cust_name:= fncCustName_Get(3027);
  dbms_output.put_line(disp_cust_name);

end;
/

顧客名は取得できます。

■デルファイソース
procedure TfrmStoredProc.btnCustNameClick(Sender: TObject);
var
  intCustNo:integer;
begin
  try
    intCustNo:=strToInt(edtCustNo.Text);

    with DMStoredProc.ADOStoredProc1 do
    begin
      Connection:= ADOCnn;
      ProcedureName := 'fncCustName_Get';
      Parameters.Clear;
      Parameters.CreateParameter('param_cust_no',ftInteger,pdInput,0,intCustNo);
      Parameters.CreateParameter('ret_cust_name',ftString,pdReturnValue,48,null);
      ExecProc; //open;でも同様のエラーが発生します。

      lblCustName.Caption:=
        VarToStr(Parameters.ParamByName('ret_cust_name').Value);
    end;
  except
    on E: Exception do MessageDlg(E.Message, mtWarning, [mbOK], 0);
  end;
end;

ストアドへパラメータが渡されていないのですが、
ヘルプやデモファイルを見ると
paNullable
paLong
paSigned
などのプロパティ?があり、
設定不足かと考えていますが分かりません。
どうぞ宜しくお願いします。


通りすがお  2008-12-04 18:54:08  No: 32754

>>Parameters.CreateParameter('param_cust_no',ftInteger,pdInput,0,intCustNo);    >>Parameters.CreateParameter('ret_cust_name',ftString,pdReturnValue,48,null);

の部分が上下逆かな。外していたらごめんなさい。


fujiken  2008-12-05 21:21:53  No: 32755

お世話になります。
通りすがおさん。どうもありがとうございます。
パラメータを作る順を上下逆にすると、なんのエラーも無く、
期待通りに顧客名が帰ってきました。

リターンを先に指定して、インプットを後に指定するのは、
考えもつきませんでした。
実を言うと、だまされたと思ってやるだけやってみようと、
試してみたのです。
うたがってごめんなさい。恥ずかしく思います。

因みに、オブジェクトインスペクタで、
ADOStoredProcのAttibutesプロパティ3つは共に初期値falseのままです。
paSigned
paNullable
paLong

どうもありがとうございました。


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

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






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