2012-12-28 123 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

相關問題