?? core10.htm
字號:
<html><head><title>第十章 存 儲 過 程 http://jjlzg.yeah.net</title><meta http-equiv=Content-Type content="text/html; charset=gb2312"></head><body bgcolor="#00000" text="#00cc66"><b>第十章 存 儲 過 程</b><br> 這一章介紹怎樣使用存儲過程。存儲過程是數(shù)據(jù)庫服務(wù)器端的一段程序,它有兩種類型。一種類似于SELECT查詢,用于檢索數(shù)據(jù),檢索到的數(shù)據(jù)能夠以數(shù)據(jù)集的形式返回給客戶。另一種類似于INSERT或DELETE查詢,它不返回數(shù)據(jù),只是執(zhí)行一個動作。有的服務(wù)器允許同一個存儲過程既可以返回數(shù)據(jù)又可以執(zhí)行動作。<br> <b>10.1 概 述</b><br> 在不同類型的服務(wù)器上,存儲過程的工作方式是不同的。例如,對于InterBase服務(wù)器來說,它能夠以輸出參數(shù)的形式返回數(shù)據(jù),而對于其他服務(wù)器如MicrosoftSQL Server和Sybase,能夠以數(shù)據(jù)集的形式返回數(shù)據(jù)和信息。<br> 在Delphi 4中,要訪問和操縱服務(wù)器上的存儲過程,可以使用TStoredProc構(gòu)件或TQuery構(gòu)件。至于到底選擇哪一個,取決于存儲過程本身是怎樣編寫的、數(shù)據(jù)怎樣返回和使用哪一種服務(wù)器。TStoredProc構(gòu)件和TQuery構(gòu)件都是從TDataSet繼承下來的。<br> TStoredProc構(gòu)件適合于執(zhí)行那些不需要返回數(shù)據(jù),并且通過輸出參數(shù)來返回信息的存儲過程。TStoredProc構(gòu)件的Params屬性用于管理這些參數(shù),同時,TStoredProc構(gòu)件的GetResults函數(shù)可以顯式地申請返回結(jié)果。總之,TStoredProc構(gòu)件適合于執(zhí)行那些不需要返回結(jié)果或者只是通過輸出參數(shù)返回結(jié)果的存儲過程。<br> TQuery構(gòu)件適合于執(zhí)行那些能夠返回數(shù)據(jù)集的存儲過程,包括InterBase服務(wù)器上通過輸出參數(shù)返回數(shù)據(jù)集的存儲過程。當(dāng)然,TQuery構(gòu)件也適合于執(zhí)行那些不需要返回結(jié)果或者只是通過輸出參數(shù)返回結(jié)果的存儲過程。<br> 參數(shù)既可以由存儲過程傳遞給客戶程序,也可以由客戶程序傳遞給存儲過程,前者稱為輸出參數(shù),后者稱為輸入?yún)?shù)。對于有的服務(wù)器來說,輸出參數(shù)只能傳遞一個值,而有的服務(wù)器允許輸出參數(shù)傳遞一個數(shù)據(jù)集。<br> <b>10.2 什么時候需要用存儲過程</b><br> 如果服務(wù)器定義了存儲過程,應(yīng)當(dāng)根據(jù)需要決定是否要用存儲過程。存儲過程通常是一些經(jīng)常要執(zhí)行的任務(wù),這些任務(wù)往往是針對大量的記錄而進(jìn)行的。在服務(wù)器上執(zhí)行存儲過程,可以改善應(yīng)用程序的性能。這是因為:<br> .服務(wù)器往往具有強(qiáng)大的計算能力和速度。<br> .避免把大量的數(shù)據(jù)下載到客戶端,減少網(wǎng)絡(luò)上的傳輸量。<br> 例如,假設(shè)一個應(yīng)用程序需要計算一個數(shù)據(jù),這個數(shù)據(jù)需要涉及到許多記錄。如果不使用存儲過程的話,把這些數(shù)據(jù)下載到客戶端,導(dǎo)致網(wǎng)絡(luò)上的流量劇增。<br> 不僅如此,客戶端可能是一臺老掉牙的計算機(jī),它的運算速度很慢。而改用存儲過程后,服務(wù)器會很快地把數(shù)據(jù)計算出來,并且只需傳遞一個數(shù)據(jù)給客戶端,其效率之高是非常明顯的。<br> <b>10.3 怎樣使用存儲過程</b><br> 應(yīng)用程序怎樣使用存儲過程,取決于存儲過程本身是怎樣編寫的、數(shù)據(jù)怎樣返回和使用哪一種服務(wù)器。<br> <b>10.3.1 使用存儲過程的一般步驟</b><br> 要訪問服務(wù)器上的存儲過程,一般是這么幾個步驟:<br> 第一步,把一個TStoredProc構(gòu)件放到窗體或數(shù)據(jù)模塊上。<br> 第二步,設(shè)置DatabaseName屬性指定一個數(shù)據(jù)庫,可以設(shè)為BDE別名或者應(yīng)用程序?qū)S玫膭e名(如果用TDatabase構(gòu)件連接數(shù)據(jù)庫的話)。<br> 第三步,設(shè)置StoredProcName屬性指定存儲過程的名稱。如果前面正確設(shè)置了DatabaseName屬性,就可以從一個下拉列表中選擇一個存儲過程。由于經(jīng)常要在運行期執(zhí)行不同的存儲過程,因此,StoredProcName屬性一般是在運行期設(shè)置的。<br> 第四步,單擊Params邊上的省略號按鈕打開一個編輯器。如果第二步和第三步設(shè)置正確的話,在這個編輯器中將顯示所有的輸入和輸出參數(shù),否則,這個編輯器就是空的。<br> 要說明的是,并不是所有的服務(wù)器都能夠提供有關(guān)的參數(shù)的信息。如果服務(wù)器沒有提供有關(guān)參數(shù)的信息,就得自己建立這些參數(shù)。<br> <b>10.3.2 準(zhǔn)備和執(zhí)行存儲過程</b><br> 在執(zhí)行存儲過程之前,最好先通知服務(wù)器準(zhǔn)備好,這就要調(diào)用TStoredProc構(gòu)件的Prepare函數(shù),例如:<br> StoredProc1.Prepare;<br> 注意:如果應(yīng)用程序在運行期改變了參數(shù)的信息,必須重新調(diào)用Prepare函數(shù)。要執(zhí)行存儲過程,可以調(diào)用TStoredProc構(gòu)件的ExecProc函數(shù),程序示例如下:<br> StoredProc1.Params[0].AsString := Edit1.Text;<br> StoredProc1.Prepare;<br> StoredProc1.ExecProc;<br> 注意:如果在調(diào)用ExecProc之前沒有調(diào)用Prepare,TStoredProc構(gòu)件會自動把參數(shù)準(zhǔn)備好,存儲過程執(zhí)行完畢后,再自動取消準(zhǔn)備。不過,如果一個存儲過程要反復(fù)執(zhí)行多次的話,最好顯式地調(diào)用Prepare,不再需要執(zhí)行存儲過程時調(diào)用UnPrepare函數(shù)。<br> 執(zhí)行了存儲過程后,它有可能返回這樣幾種數(shù)據(jù):<br> .一是數(shù)據(jù)集,可以用標(biāo)準(zhǔn)的數(shù)據(jù)控件顯示其中的數(shù)據(jù)。<br> .二是輸出參數(shù)。<br> .三是狀態(tài)信息。<br> <b>10.4 創(chuàng)建一個存儲過程</b><br> 存儲過程一般是用專門的工具編寫的。不過,這里要介紹的是怎樣用SQL語句在運行期動態(tài)地創(chuàng)建存儲過程。對于不同的服務(wù)器來說,即使是相同功能的存儲過程,SQL語句也有可能是不同的,因此,必須事先查閱服務(wù)器的文檔。<br> <b>10.4.1 使用SQL語句創(chuàng)建存儲過程</b><br> 要使用SQL語句創(chuàng)建存儲過程,就要用到TQuery構(gòu)件的SQL屬性。如果存儲過程中要用到參數(shù)的話,必須把TQuery構(gòu)件的ParamCheck屬性設(shè)為False。<br> 下面的例子演示了怎樣用SQL語句創(chuàng)建一個存儲過程:<br> With Query1 Do<br> Begin<br> ParamCheck := False; <br> With SQL Do<br> Begin<br> Clear;<br> Add('CREATE PROCEDURE GET_MAX_EMP_NAME');<br> Add('RETURNS (Max_Name CHAR(15))');<br> Add('AS');Add('BEGIN');<br> Add('SELECT MAX(LAST_NAME)');<br> Add('FROM EMPLOYEE');<br> Add('INTO :Max_Name;');<br> Add('SUSPEND;');<br> Add('END');End;<br> ExecSQL;<br> End;<br> 當(dāng)然,也可以用SQL Explorer來創(chuàng)建存儲過程。<br> <b>10.4.2 用TQuery構(gòu)件檢索數(shù)據(jù)集</b><br> 要用TQuery構(gòu)件從存儲過程中檢索數(shù)據(jù)集,必須正確設(shè)置SQL屬性。在SELECT語句中,要用存儲過程的名稱代替表格的名稱。如果存儲過程需要傳遞輸入?yún)?shù)的話,要仿照Object Pascal語言的過程那樣,在存儲過程后面用一對圓括號把參數(shù)的值括起來。如果有多個輸入?yún)?shù),彼此之間要用逗號隔開。<br> 例如,InterBase服務(wù)器上有一個存儲過程叫GET_EMP_PROJ,它需要傳遞一個輸入?yún)?shù)叫EMP_NO,并且通過一個輸出參數(shù)叫PROJ_ID來傳遞執(zhí)行結(jié)果。下面是這個存儲過程的代碼:<br> CREATE PROCEDURE GET_EMP_PROJ (EMP_NO SMALLINT)<br> RETURNS (PROJ_ID CHAR(5))<br> AS<br> BEGIN<br> FOR SELECT PROJ_ID<br> FROM EMPLOYEE_PROJECT<br> WHERE EMP_NO = :EMP_NO<br> INTO :PROJ_ID<br> DO<br> SUSPEND;<br> END<br> 相應(yīng)地,要通過上面這個存儲過程檢索數(shù)據(jù)集,SQL語句可以這樣寫:<br> SELECT *<br> FROM GET_EMP_PROJ(52) <br> <b>10.4.3 用TStoredProc構(gòu)件檢索數(shù)據(jù)集</b><br> 要用TStoredProc構(gòu)件從存儲過程中檢索數(shù)據(jù)集,必須設(shè)置StoredProcName屬性指定一個存儲過程的名稱。如果存儲過程需要傳遞輸入?yún)?shù)的話,可以通過Params屬性或ParamByName函數(shù)提供參數(shù)。<br> 例如,Sybase服務(wù)器上有一個存儲過程叫GET_EMPLOYEES,它有個輸入?yún)?shù)叫@EMP_NO。下面是這個存儲過程的代碼:<br> CREATE PROCEDURE GET_EMPLOYEES @EMP_NO SMALLINT<br> AS SELECT EMP_NAME, EMPLOYEE_NO FROM EMPLOYEE_TABLE<br> WHERE (EMPLOYEE_NO = @EMP_NO)<br> 相應(yīng)地,要通過上面這個存儲過程檢索數(shù)據(jù)集,程序應(yīng)當(dāng)這樣寫:<br> With StoredProc1 Do<br> Begin<br> Close;<br> ParamByName('@EMP_NO').AsSmallInt := 52;<br> Active := True;<br> End; <br> <b>10.4.4 用TQuery構(gòu)件通過參數(shù)檢索數(shù)據(jù)</b><br> 用TQuery構(gòu)件通過參數(shù)返回的數(shù)據(jù)是一條記錄,即使存儲過程只有一個輸出參數(shù)。因此,應(yīng)用程序需要從返回的數(shù)據(jù)中檢索出每一個字段的值。<br> 首先,要在SELECT語句中用存儲過程的名稱代替表格的名稱。<br> 如果有多個輸出參數(shù)的話,您可以選擇其中部分輸出參數(shù),也可以用星號表示選擇所有輸出參數(shù)。<br> 如果存儲過程需要傳遞輸入?yún)?shù)的話,在存儲過程后面用一對圓括號把參數(shù)的值括起來。如果有多個輸入?yún)?shù),彼此之間要用逗號隔開。<br> 例如,InterBase服務(wù)器上有一個存儲過程叫GET_HIGH_EMP_NAME,通過一個輸出參數(shù)叫High_Last_Name來返回EMPLOYEE表的LAST_NAME字段。<br> 下面是這個存儲過程的代碼:<br> CREATE PROCEDURE GET_HIGH_EMP_NAME<br> RETURNS (High_Last_Name CHAR(15))<br> AS<br> BEGIN<br> SELECT MAX(LAST_NAME)<br> FROM EMPLOYEE<br> INTO :High_Last_Name;<br> SUSPEND; <br> END<br> 相應(yīng)地,SQL語句應(yīng)當(dāng)這樣寫:<br> SELECT High_Last_Name<br> FROM GET_HIGH_EMP_NAME<br> <b>10.4.5 用TStoredProc構(gòu)件通過參數(shù)檢索數(shù)據(jù)</b><br> 要用TStoredProc構(gòu)件通過參數(shù)檢索數(shù)據(jù),首先要設(shè)置StoredProcName屬性指定一個存儲過程。如果存儲過程需要傳遞輸入?yún)?shù)的話,可以通過Params屬性或ParamByName函數(shù)提供參數(shù)。<br> 調(diào)用ExecProc執(zhí)行了存儲過程后,可以通過Params屬性或ParamByName函數(shù)訪問輸出參數(shù)。<br> 例如,InterBase服務(wù)器上有一個存儲過程叫GET_HIGH_EMP_NAME,通過一個輸出參數(shù)叫High_Last_Name返回EMPLOYEE表的LAST_NAME字段。<br> 下面是這個存儲過程的代碼:<br> CREATE PROCEDURE GET_HIGH_EMP_NAME<br> RETURNS (High_Last_Name CHAR(15))<br> AS <br> BEGIN<br> SELECT MAX(LAST_NAME)FROM EMPLOYEE <br> INTO :High_Last_Name;<br> SUSPEND;<br> END<br> 相應(yīng)地,要通過上面這個存儲過程檢索數(shù)據(jù),程序應(yīng)當(dāng)這樣寫:<br> With StoredProc1 Do<br> Begin<br> StoredProcName := 'GET_HIGH_EMP_NAME'ExecProc;<br> Edit1.Text := ParamByName('High_Last_Name').AsString;<br> End;<br> <b>10.4.6 用TQuery構(gòu)件執(zhí)行一個動作</b><br> 有的存儲過程并不返回數(shù)據(jù),它們只是執(zhí)行一些動作。例如,要刪除一條記錄,既可以用DELETE語句直接刪除記錄,也可以執(zhí)行一個存儲過程。<br> 要用TQuery構(gòu)件執(zhí)行一個動作,需在SQL語句中包含要執(zhí)行的存儲過程的名稱。如果存儲過程需要傳遞輸入?yún)?shù)的話,在存儲過程后面用一對圓括號把參數(shù)的值括起來。如果有多個輸入?yún)?shù),彼此之間要用逗號隔開。<br> 例如,InterBase服務(wù)器上有一個存儲過程叫ADD_EMP_PROJ,用于向EMPLOYEE_PROJECT表中增加一條記錄。<br> 下面是這個存儲過程的代碼:<br> CREATE PROCEDURE ADD_EMP_PROJ (EMP_NO SMALLINT, PROJ_ID CHAR(5))<br> AS<br> BEGIN<br> BEGIN<br> INSERT INTO EMPLOYEE_PROJECT (EMP_NO, PROJ_ID)<br> VALUES (:EMP_NO, :PROJ_ID);<br> WHEN SQLCODE -530 DO<br> EXCEPTION UNKNOWN_EMP_ID;<br> END<br> SUSPEND;<br> END<br> 相應(yīng)地,SQL語句應(yīng)當(dāng)這樣寫:<br> EXECUTE PROCEDURE ADD_EMP_PROJ(20, 'GUIDE');<br> <b>10.4.7 用TStoredProc構(gòu)件執(zhí)行一個動作</b><br> 要用TStoredProc構(gòu)件執(zhí)行一個動作,首先要設(shè)置StoredProcName屬性指定一個存儲過程。可以通過Params屬性或ParamByName函數(shù)提供輸入?yún)?shù)(如果需要的話)。<br> 例如,InterBase服務(wù)器上有一個存儲過程叫ADD_EMP_PROJ,用于向EMPLOYEE_PROJECT表中增加一條記錄。它的代碼請參見上一小節(jié)。<br> 要執(zhí)行這個存儲過程,程序應(yīng)當(dāng)這樣寫: <br> With StoredProc1 Do<br> Begin<br> StoredProcName := 'ADD_EMP_PROJ';<br> ExecProc;<br> End;<br> <b>10.5 存儲過程的參數(shù)</b><br> 要執(zhí)行服務(wù)器上的存儲過程,往往要傳遞一些參數(shù)。這些參數(shù)分為四種類型:<br> 第一種稱為輸入?yún)?shù),由客戶程序向存儲過程傳遞值。<br> 第二種稱為輸出參數(shù),由存儲過程向客戶程序返回結(jié)果。<br> 第三種稱為輸入/輸出參數(shù),既可以由客戶程序向存儲過程傳遞值,也可以由存儲過程向客戶程序返回結(jié)果。<br> 第四種稱為狀態(tài)參數(shù),由存儲過程向客戶程序返回錯誤信息。<br> 要說明的是,并不是所有的服務(wù)器都支持上述四種類型的參數(shù),例如,InterBase就不支持狀態(tài)參數(shù)。<br> 可以通過TStoredProc構(gòu)件的Params屬性訪問存儲過程的參數(shù)(TParam對象)。如果在設(shè)計期正確設(shè)置了StoredProcName屬性,Params屬性中將自動包含存儲過程的參數(shù),否則,需要自己建立參數(shù)。 <br> <b>10.5.1 輸入?yún)?shù)</b><br> 輸入?yún)?shù)用于由客戶程序向存儲過程傳遞值,值實際上是傳遞給存儲過程中的SQL語句。如果一個存儲過程有輸入?yún)?shù),一定要在執(zhí)行該存儲過程之前對輸入?yún)?shù)賦值。<br> 如果用TQuery構(gòu)件執(zhí)行存儲過程,可以把輸入?yún)?shù)用一對圓括號括起來,彼此之間用逗號隔開,就像調(diào)用Object Pascal的過程一樣。例如,假設(shè)要執(zhí)行一個存儲過程叫GET_EMP_PROJ,它需要傳遞一個輸入?yún)?shù),其值為52,SQL語句如下:<br> SELECT PROJ_ID<br> FROM GET_EMP_PROJ(52)<br> 如果用TStoredProc構(gòu)件執(zhí)行存儲過程,可以通過Params屬性或ParamByName函數(shù)來訪問每一個輸入?yún)?shù)。要在執(zhí)行存儲過程前對輸入?yún)?shù)賦值。例如,假設(shè)要執(zhí)行一個存儲過程叫GET_EMP_PROJ,它需要傳遞一個輸入?yún)?shù)叫EMP_NO,其數(shù)據(jù)類型為SMALLINT,其值為52,相應(yīng)地程序代碼應(yīng)當(dāng)這樣寫:<br> With StoredProc1 Do<br> Begin<br> ParamByName('EMP_NO').AsSmallInt := 52;<br> ExecProc;<br> End; <br> <b>10.5.2 輸出參數(shù)</b><br> 輸出參數(shù)用于由存儲過程向客戶程序傳遞結(jié)果。輸出參數(shù)是由存儲過程賦值的,客戶程序只能在執(zhí)行了存儲過程以后,才能訪問輸出參數(shù)的值。<br> 要訪問輸出參數(shù)的值,可以通過TStoredProc構(gòu)件的Params屬性或ParamByName函數(shù)。例如,下面的代碼把輸出參數(shù)的值顯示到一個編輯框中:<br> With StoredProc1 Do<br> Begin<br> ExecProc;<br> Edit1.Text := Params[0].AsString;<br> End;<br> 大多數(shù)存儲過程都有一個或幾個輸出參數(shù),輸出參數(shù)既可以返回一個單獨的值,也可以返回一個數(shù)據(jù)集。<br> 注意:有的服務(wù)器如InFormix可能不提供參數(shù)的信息,只能從存儲過程的代碼中查看它有無輸出參數(shù)。<br> <b>10.5.3 輸入/輸出參數(shù)</b><br> 輸入/輸出參數(shù)既可以用于由客戶程序向存儲過程傳遞值,也可以由存儲過程向客戶程序返回結(jié)果,也就是說,同一個參數(shù)兼具兩種角色。作為輸入?yún)?shù),必須在執(zhí)行存儲過程之前對它賦值。作為輸出參數(shù),只能在執(zhí)行了存儲過程后訪問它的值。<br> 例如,Oracle服務(wù)器中有一個存儲過程,它的IN_OUTVAR參數(shù)就是一個輸入/輸出參數(shù)。這個存儲過程的代碼如下:<br> CREATE OR REPLACE PROCEDURE UPDATE_THE_TABLE (IN_OUTVAR IN OUT INTEGER)<br> AS<br> BEGIN<br> UPDATE ALLTYPETABLE<br> SET NUMBER82FLD = IN_OUTVAR<br> WHERE KEYFIELD = 0;<br> IN_OUTVAR:=1;<br> END <br> UPDATE_THE_TABLE;<br> 相應(yīng)地,要執(zhí)行上面這個存儲過程,程序代碼應(yīng)當(dāng)這樣寫:<br> With StoredProc1 Do<br> Begin<br> ParamByName('IN_OUTVAR').AsInteger := 103;<br> ExecProc;IntegerVar := ParamByName('IN_OUTVAR').AsInteger;<br> End; <br> <b>10.5.4 狀態(tài)參數(shù)</b><br> 除了返回數(shù)據(jù)集或輸出參數(shù)外,有的存儲過程還可以返回一個狀態(tài)參數(shù)。狀態(tài)參數(shù)不需要事先賦值,只有在執(zhí)行了存儲過程之后才能訪問它的值。<br> 要訪問輸出參數(shù)的值,可以通過TStoredProc構(gòu)件的Params屬性或ParamByName函數(shù)。例如,下面的代碼訪問ByOutputParam參數(shù):<br> DateVar := StoredProc1.ParamByName('ByOutputParam').AsDate;<br> <b>10.5.5 怎樣在設(shè)計期訪問參數(shù)</b><br> 如果在設(shè)計期正確設(shè)置了DatabaseName和StoredProcName屬性,就可以在設(shè)計期看到這些參數(shù),對于其中的輸入?yún)?shù),可以設(shè)置它們的值。不過,有的數(shù)據(jù)庫服務(wù)器不提供存儲過程的參數(shù)信息,這種情況下,只能使用SQLExplorer去查看存儲過程的代碼,從中找出參數(shù)的名稱和類型,然后在對象觀察器中手動建立這些參數(shù)。<br> 要在設(shè)計期訪問參數(shù),可以單擊Params屬性邊上的省略號按鈕打開如圖10.1所示的編輯器:<br> 圖10.1 存儲過程的參數(shù)<br> 單擊工具欄上的按鈕可以創(chuàng)建一個新的參數(shù),單擊按鈕可以刪除一個參數(shù),單擊按鈕可以把參數(shù)的順序上移,單擊按鈕可以把參數(shù)的順序下移。<br> 選擇其中一個參數(shù),對象觀察器將同步顯示該參數(shù)的屬性。其中,ParamType屬性必須設(shè)置,以指定參數(shù)的使用類型,可以設(shè)為Input、Output、Input/Output或Result。DataType屬性也必須設(shè)置,以指定參數(shù)的數(shù)據(jù)類型。注:對于Oracle的存儲過程來說,要返回數(shù)據(jù)集,必須把DataType屬性設(shè)為ftCursor。對于輸入?yún)?shù)或輸入/輸出來說,必須設(shè)置Value屬性給參數(shù)賦值。不能對輸出參數(shù)和狀態(tài)參數(shù)賦值。 <br> <b>10.5.6 怎樣在運行期訪問參數(shù)</b><br> 如果服務(wù)器沒有提供有關(guān)參數(shù)的信息,就必須自己建立參數(shù)。在運行期,可以通過TParam的Create或TParams的AddParam來創(chuàng)建一個參數(shù)。<br> 例如,InterBase服務(wù)器上有一個存儲過程叫GET_EMP_PROJ,這個存儲過程有一個輸入?yún)?shù)叫EMP_NO和一個輸出參數(shù)叫PROJ_ID。這個存儲過程的代碼如下:<br> CREATE PROCEDURE GET_EMP_PROJ (EMP_NO SMALLINT)<br> RETURNS (PROJ_ID CHAR(5))<br> AS<br> BEGIN<br> FOR SELECT PROJ_IDFROM EMPLOYEE_PROJECT<br> WHERE EMP_NO = :EMP_NO<br> INTO :PROJ_ID<br> DO<br> SUSPEND;<br> END<br> 下面通過編程動態(tài)地創(chuàng)建這兩個參數(shù):<br> var<br> P1, P2: TParam;<br> Begin <br> ...<br> With StoredProc1 Do<br> Begin<br> StoredProcName := 'GET_EMP_PROJ';<br> Params.Clear;<br> P1 := TParam.Create(Params, ptInput);<br> P2 := TParam.Create(Params, ptOutput);<br> TryParams[0].Name := 'EMP_NO';Params[1].Name := 'PROJ_ID';<br> ParamByname('EMP_NO').AsSmallInt := 52;<br> ExecProc;Edit1.Text := ParamByname('PROJ_ID').AsString;<br> FinallyP1.Free;<br> P2.Free;<br> End;<br> End;<br> ...<br> End; <br> <b>10.5.7 ParamBindMode屬性</b><br> 這個屬性用于設(shè)置Params屬性中的每一個參數(shù)與存儲過程的參數(shù)怎樣匹配。<br> 如果ParamBindMode屬性設(shè)為pbByName(默認(rèn)),表示Params屬性中的參數(shù)按名稱與存儲過程的參數(shù)匹配。<br> 如果ParamBindMode設(shè)為pbByNumber,表示Params屬性中的參數(shù)按序號與存儲過程的參數(shù)匹配。<br> 建議把ParamBindMode屬性設(shè)為pbByName,因為按名稱匹配不需要參數(shù)的順序,而按序號匹配往往容易搞錯。不過,有的情況下可能需要按序號匹配,因為有的服務(wù)器并沒有提供參數(shù)的名稱。</body></html>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -