我在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程序而不是函数。也许这个问题可以通过其他方式解决......
答案 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;