如何将DATE类型的参数传递给函数

时间:2012-12-28 08:39:44

标签: oracle delphi delphi-7

我在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,即:RES:=Search(sysdate);,则可以正常使用。

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


找到ORA-06550 when Oracle stored function is called.。然而,这与Kylix Pascal IDE有关。我预计会遇到delphi的相同行为吗?没有尝试使用oracle程序而不是函数。也许这个问题可以通过其他方式解决......

3 个答案:

答案 0 :(得分:3)

Oracle没有绑定变量的日期类型 - 您需要将绑定变量显式转换为日期:

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

然后,您应该能够将变量作为与您指定的日期格式匹配的字符串传递。

答案 1 :(得分: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);
 ..........

答案 2 :(得分: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;