----start
預存程序之間可以相互調用,如何在它們之間傳遞資料呢?有以下3種方法。
一:通過輸入輸出參數傳遞資料
這是最簡單的一種方式,不過值得注意的是,預存程序中的RETURN語句和其它程式設計語言中的return語句含義是不同的。預存程序中的return語句放回sqlcode值。
二:通過會話全域變數傳遞資料
--串連資料庫<br />CONNECT TO SAMPLE!</p><p>--建立會話全域變數<br />CREATE VARIABLE MYVAR INTEGER DEFAULT 0!</p><p>--建立預存程序1<br />CREATE PROCEDURE TESTPROC1 ()<br />BEGIN<br /> SET MYVAR=10;<br />END!</p><p>--建立預存程序2<br />CREATE PROCEDURE TESTPROC2 (OUT MSG CHAR(20))<br />BEGIN<br /> CALL TESTPROC1();</p><p> IF MYVAR=10 THEN<br /> SET MSG='測試成功';<br /> ELSE<br /> SET MSG='測試失敗';<br /> END IF;<br />END!</p><p>--調用預存程序2<br />CALL TESTPROC2(?)!</p><p>--刪除預存程序<br />DROP PROCEDURE TESTPROC1!<br />DROP PROCEDURE TESTPROC2!</p><p>--關閉串連<br />CONNECT RESET!
三:在預存程序之間傳遞遊標
要想在一個預存程序中使用另一個預存程序的結果集,需要以下步驟:
1、聲明一個結果集定位器:DECLARE <rs_locator_var> RESULT_SET_LOCATOR VARYING;
2、將這個結果集定位器與調用者過程相關聯:ASSOCIATE RESULT SET LOCATOR( <rs_locator_var>) WITH PROCEDURE <proc_called>;
3、分配從調用過程指向結果集的遊標:ALLOCATE <cursor> CURSOR FOR RESULT SET <rs_locator_var>;
--串連資料庫<br />CONNECT TO SAMPLE!</p><p>--建立預存程序1<br />CREATE PROCEDURE TESTPROC1 ()<br />DYNAMIC RESULT SETS 1<br />P1:BEGIN<br /> --聲明遊標<br /> DECLARE MYCUR CURSOR WITH RETURN FOR<br /> SELECT * FROM<br /> (<br /> VALUES<br /> (1),<br /> (2),<br /> (3)<br /> );<br /> --開啟遊標<br /> OPEN MYCUR;<br />END P1!</p><p>--建立預存程序2<br />CREATE PROCEDURE TESTPROC2 (OUT RES INTEGER)<br />BEGIN<br /> DECLARE SQLCODE INT DEFAULT 0;</p><p> --聲明一個結果集定位器<br /> DECLARE LOC1 RESULT_SET_LOCATOR VARYING;<br /> DECLARE X INT DEFAULT 0;</p><p> SET RES=0;<br /> CALL TESTPROC1();</p><p> --將這個結果集定位器與調用者過程相關聯<br /> ASSOCIATE RESULT SET LOCATOR(LOC1) WITH PROCEDURE TESTPROC1;</p><p> --分配從調用過程指向結果集的遊標<br /> ALLOCATE C1 CURSOR FOR RESULT SET LOC1;</p><p> FETCH FROM C1 INTO X;<br /> WHILE SQLCODE = 0 DO<br /> SET RES = RES + X;<br /> FETCH FROM C1 INTO X;<br /> END WHILE;<br />END!</p><p>--調用預存程序2<br />CALL TESTPROC2(?)!</p><p>--刪除預存程序<br />DROP PROCEDURE TESTPROC1!<br />DROP PROCEDURE TESTPROC2!</p><p>--關閉串連<br />CONNECT RESET!
----更多參見:SQL PL 精萃
----聲明:轉載請註明出處。
----last updated on 2010.2.3
----written by ShangBo on 2010.2.3
----end