2

Oracleデータベースに関数があります。デルフィから呼ぶ必要があります。私は次のコードを使用します:

procedure TForm1.Run;
var
 q:TADOQuery;
begin
 q:=TADOQuery.Create(nil);
 q.Connection:=ADOConnection1;
 q.ParamCheck:=false;

 q.SQL.Add('BEGIN');
 q.SQL.Add(' :RES:=Search(:P_DATE);');
 q.SQL.Add('END;');

 q.Parameters.AddParameter.Name:='P_DATE';
 q.Parameters.ParamByName('P_DATE').Direction:=pdInput;
 q.Parameters.ParamByName('P_DATE').DataType:=ftDate;
 q.Parameters.ParamByName('P_DATE').Value:=Now;
 q.Parameters.AddParameter.Name:='RES';
 q.Parameters.ParamByName('RES').DataType:=ftFloat;
 q.Parameters.ParamByName('RES').Direction:=pdOutput;
 q.Parameters.ParamByName('RES').Value:=1;

 q.ExecSQL;
 //...

ora-06550エラーが発生しますinvalid number or type of parametersP_DATEパラメータをに変更するとsysdate、つまり:RES:=Search(sysdate);、正常に動作します。

では、どうすればタイプの「in」パラメータをDATEdelphiからoracle関数に渡すことができますか?


Oracleストアド関数が呼び出されたときにORA-06550が見つかりました。。ただし、これはKylixPascalIDEに関連しています。デルファイでも同じ振る舞いをすることが期待されていますか?関数の代わりにoracleプロシージャを使用しようとしませんでした。たぶん、この問題は他の方法で解決することができます...

4

3 に答える 3

3

Oracleにはバインド変数の日付型がありません。バインド変数を日付に明示的に変換する必要があります。

:res := search(to_date(:p_date, 'dd/mm/yyyy'));

これで、指定した日付形式に一致する文字列として変数を渡すことができるはずです。

于 2012-12-28T08:57:23.747 に答える
1

あなたはそれを間違っています(そして、ほんの数日前にこの同じ質問(異なる機能ですが同じアイデア)を尋ねた重複として前の質問が削除されたと思います)。

そもそも関数を間違って呼び出しています。

.........
q.SQL.Add('BEGIN');
q.SQL.Add('  SELECT Search(TO_DATE(:P_DATE,''YYYYMMDD'')) FROM System.Dual;');
q.SQL.Add('END;');

q.Parameters.AddParameter.Name:='P_DATE';
q.Parameters.ParamByName('P_DATE').Direction:=pdInput;
q.Parameters.ParamByName('P_DATE').DataType:=ftDate;
q.Parameters.ParamByName('P_DATE').Value:=Now;
q.Open;

if not q.IsEmpty then     // or not q.Eof
  Res := q.Fields[0].AsFloat;
于 2012-12-28T13:32:49.473 に答える
1

このパラメータを文字列として送信してみてください。

 .........
 q.SQL.Add('BEGIN');
 q.SQL.Add(' :RES:=Search(TO_DATE(:P_DATE,''YYYYMMDD''));');
 q.SQL.Add('END;');

 q.Parameters.AddParameter.Name:='P_DATE';
 q.Parameters.ParamByName('P_DATE').Direction:=pdInput;
 q.Parameters.ParamByName('P_DATE').DataType:=ftString;
 q.Parameters.ParamByName('P_DATE').Value:=FormatDateTime('yyyymmdd',Now);
 ..........
于 2012-12-28T09:04:19.480 に答える