2

我在 oracle 数据库中有一个函数。我需要从delphi调用它。我使用以下代码:

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 parameters。如果我将P_DATE参数更改为sysdate, ie :RES:=Search(sysdate);,它工作正常。

那么如何将类型的“in”参数DATE从delphi传递给oracle函数呢?


调用 Oracle 存储函数时发现ORA-06550。. 然而,这与 Kylix Pascal IDE 有关。我是否希望遇到与 delphi 相同的行为?没有尝试使用 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(' :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 回答
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 回答