線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4504
推到 Plurk!
推到 Facebook!

Oracle RETURN CURSOR 我要如何接回呢??

缺席
elvis114
一般會員


發表:37
回覆:53
積分:18
註冊:2003-06-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-21 18:24:20 IP:61.220.xxx.xxx 未訂閱
我要如何從 Oracle RETURN CURSOR 接回值呢?? Oracle PROCEDURE  如下:    PROCEDURE select_department (          R_cursor          OUT            RET_Curor.RET_type_cursor,          oRETVAL                OUT         NUMBER          ) IS              vRETVAL          NUMBER(1):=0;              BEGIN              OPEN R_cursor FOR                   select DEPT_NAME from department              where DELETE_FLAG = DEL_FLAG             order by DEPT_CODE;     vRETVAL := 0;     oRETVAL := vRETVAL;         RETURN;   EXCEPTION                   when others then                                       vRETVAL := -1;                     oRETVAL := vRETVAL;                         RETURN;             raise;   END; --------------------------- Delphi6 如下: HR_Oracle.ADOSProc.Close;     HR_Oracle.ADOSProc.Parameters.Clear;     HR_Oracle.ADOSProc.ProcedureName := 'PKG_StatisticsSOFTWARE.select_department';     HR_Oracle.ADOSProc.Parameters.CreateParameter('oRetval',ftInteger,pdOutput,10,0);        try         HR_Oracle.ADOSProc.ExecProc;         HR_Oracle.ADOSProc.Open;         for i:= 0 to HR_Oracle.ADOSProc.RecordCount-1 do begin             tmpst := '';             for j := 0 to HR_Oracle.ADOSProc.Fields.Count-1 do                 tmpst := tmpst + HR_Oracle.ADOSProc.Fields[j].AsString + '--';         //memo1.Lines.Add(tmpst);             HR_Oracle.ADOSProc.Next;         end;     except  On E:Exception do                         begin                         showmessage(E.Message);                         Memo1.Text := E.Message ;                         RunError;;                         end;     end; ----------------------- Error Message 如下: ORA-06550: 第 1 行, 第 7 個欄位:  PLS-00306: 呼叫 'SELECT_DEPARTMENT' 時參數類型的數目錯誤 ORA-06550: 第 1 行, 第 7 個欄位:  PL/SQL: Statement ignored    ======================= 謝謝各位大德不吝賜教!! 小弟感激不進 =======================
------

南無藥師琉璃光如來
保佑您
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-21 21:32:09 IP:218.32.xxx.xxx 未訂閱
elvis114 你好: 參考這篇看看: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=48618
elvis114
一般會員


發表:37
回覆:53
積分:18
註冊:2003-06-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-22 10:33:57 IP:61.220.xxx.xxx 未訂閱
嘿嘿我就知道會叫我看: -------------------------------------------------------- elvis114 你好:    參考這篇看看: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=48618 --------------------------------------------------------      這一篇我已經看過了,所以現在我依照他們討論的結果做測試!! 但是TADOStoredProc真的是他們講的這樣嗎??< > 有沒有人真的比較了解而又有實際用過,可否給我明確一點的訊息!! 謝謝< > ======================= 謝謝各位大德不吝賜教!! 小弟感激不進 =======================
------

南無藥師琉璃光如來
保佑您
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-23 11:56:52 IP:61.229.xxx.xxx 未訂閱
引言: 有沒有人真的比較了解而又有實際用過,可否給我明確一點的訊息!! 謝謝 < face="Verdana, Arial, Helvetica"> 這個....小弟我就是自己有用過,提供給您我的經驗: 1.依照您的Error Message,我猜應該是您的DB端有問題.在http://delphi.ktop.com.tw/topic.php?TOPIC_ID=48618的討論裡,是以package來做的.換言之,store procedure參數中的cursor是另外定義的.而依您的錯誤訊息來看,顯然是"RET_Curor.RET_type_cursor"這個物件沒有宣告,您要不要檢查一下,您是否有另外宣告了這個物件. 2.該篇討論中,最後zabico的結論"ConnectionString裡面要用 Microsoft OLE DB Provider for Oracle ,另外一個不能用"其實並不能算完全正確.兩個driver應該都可以用,只是要注意版本的限制及一些Oracle比較偏門的SQL指令,兩個Driver不見得執行起來會有相同的結果,必需測試過才準. 3.以Oracle回傳cursor,不管是用BDE或是ADO,其實都可以執行.只是我在TADOStoredProc的Online help裡找到的ftCursor,是宣告在ADODB裡,所以我一開始才認為只有ADO才能這樣做(加上我之前做的,就是用ADO連Oracle的).
elvis114
一般會員


發表:37
回覆:53
積分:18
註冊:2003-06-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-25 14:45:41 IP:61.220.xxx.xxx 未訂閱
Dear change.jian : 參考完討論的內容後我的程式更改如下: Oracle 如下: PACKAGE PKG_StatisticsSOFTWARE IS TYPE RET_type_cursor IS REF CURSOR; PROCEDURE select_department ( R_cursor OUT RET_type_cursor, oRETVAL OUT NUMBER ); ----------------------------------------------------------------- PACKAGE BODY PKG_StatisticsSOFTWARE IS PROCEDURE select_department ( R_cursor OUT RET_type_cursor, oRETVAL OUT NUMBER ) IS vRETVAL NUMBER(1):=0; BEGIN OPEN R_cursor FOR select DEPT_NAME from department where DELETE_FLAG = DEL_FLAG order by DEPT_CODE; vRETVAL := 0; oRETVAL := vRETVAL; RETURN; EXCEPTION when others then vRETVAL := -1; oRETVAL := vRETVAL; RETURN; raise; END; --------------------------------------------------- Delphi6 如下: HR_Oracle.ADOSProc.Close; HR_Oracle.ADOSProc.ProcedureName := 'PKG_StatisticsSOFTWARE.select_department'; HR_Oracle.ADOSProc.Parameters.Clear; HR_Oracle.ADOSProc.Parameters.CreateParameter('R_cursor',ftInterface ,pdOutput,0,null); HR_Oracle.ADOSProc.Parameters.CreateParameter('oRETVAL' ,ftInteger,pdOutput,1,0); try HR_Oracle.ADOSProc.Open ; for i:= 0 to HR_Oracle.ADOSProc.RecordCount-1 do begin tmpst := ''; for j := 0 to HR_Oracle.ADOSProc.Fields.Count-1 do tmpst := tmpst HR_Oracle.ADOSProc.Fields[j].AsString '--'; memo1.Lines.Add(tmpst); HR_Oracle.ADOSProc.Next; end; except On E:Exception do begin showmessage(E.Message '無法正常連線,請查明原狀況!!'); Memo1.Text := E.Message ; Exit; //RunError;; end; end; ----------------------------------------------- Oracle Error 出現如下: ORA-01036: 變數名稱?號碼無效 <> > 謝謝< > ======================= 謝謝各位大德不吝賜教!! 小弟感激不進< > =======================
------

南無藥師琉璃光如來
保佑您
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-26 17:53:18 IP:61.222.xxx.xxx 未訂閱
HR_Oracle.ADOSProc.Parameters.CreateParameter('R_cursor',ftInterface ,pdOutput,0,null); 
//改成如下
HR_Oracle.ADOSProc.Parameters.CreateParameter('R_cursor',ftCursor,pdOutput,0,null);
elvis114
一般會員


發表:37
回覆:53
積分:18
註冊:2003-06-17

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-06-04 20:01:40 IP:61.220.xxx.xxx 未訂閱
謝謝 change.jian ,但是還是不行!! 不過粉奇怪的是我把這一行註解掉後就> ///> > ======================= 謝謝各位大德不吝賜教!! 小弟感激不進< > =======================
------

南無藥師琉璃光如來
保佑您
系統時間:2024-06-29 9:32:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!