2012-12-28 78 views
2

我在oracle数据库中有一个函数。我需要从delphi中调用它。我使用下面的代码:如何将类型DATE的参数传递给函数

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函数?


Found ORA-06550 when Oracle stored function is called.。但是这涉及到Kylix Pascal IDE。我预计会遇到与delphi相同的行为吗?没有尝试使用oracle过程而不是函数。也许这个问题是可以解决的一些怎么回事...

回答

3

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

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

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

+0

当我使用这个我得到ora-01840,说_input值不够日期格式_我做错了什么? – horgh

+0

此外,它不会将函数结果代码传递给RES参数 – horgh

+0

您作为日期传递的字符串与给定的格式(在to_date中)不匹配。例如,要使用上面使用的格式掩码通过2012年12月29日,字符串必须是2012年12月29日。您使用的字符串必须短于提供的掩码。 –

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); 
.......... 
+0

当我使用这个,我得到ora-01840,说_input值不够长日期format_我做错了什么? – horgh

+0

此外,它不会将函数结果代码传递到'RES'参数 – horgh

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; 
+0

恕我直言,你必须打开,而不是ExecSQL得到结果集 –

+0

@SirRufo:是的,你是对的。我从原始问题复制/粘贴,并在进行更改时错过了这一点。修好了,谢谢指出。 :-) –

+0

@KenWhite当我使用你建议的sql语法时,我得到ORA-06572错误,说SQL语句引用的_PL/SQL函数不能包含OUT参数。我应该如何克服这个问题?为什么你说,原始问题中发布的语法是错误的?甲骨文没有提到这一点,并且实际上做了这项工作 – horgh

相关问题