亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? core10.htm

?? Delphi4核心編程技術(shù)
?? HTM
?? 第 1 頁 / 共 2 頁
字號:
<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 + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲另类春色国产| 欧美日韩一区视频| 国产精品人妖ts系列视频| 国内精品自线一区二区三区视频| 91精品国产免费| 久久99精品久久久久| 久久一区二区三区四区| 国产黄色91视频| 国产精品国产三级国产aⅴ中文| 成人精品gif动图一区| 综合久久久久久久| 在线精品国精品国产尤物884a| 亚洲va国产天堂va久久en| 日韩午夜精品视频| 国产精品一区二区在线看| 国产精品色在线| 欧美无砖专区一中文字| 久久99精品久久久久久国产越南 | 最近中文字幕一区二区三区| 99久久99久久综合| 五月婷婷综合网| 欧美精品一区二区三区在线播放| 国产精品中文字幕日韩精品| 亚洲色图清纯唯美| 3d动漫精品啪啪1区2区免费 | 成人影视亚洲图片在线| 一区二区三区四区高清精品免费观看| 欧美猛男gaygay网站| 韩国女主播一区| 亚洲色图欧美在线| 精品久久久久香蕉网| 成人性生交大合| 天天综合天天综合色| 国产精品亲子伦对白| 欧美人xxxx| 国产91富婆露脸刺激对白| 午夜日韩在线观看| 中文字幕视频一区| 精品国产髙清在线看国产毛片| av欧美精品.com| 免费视频最近日韩| 亚洲综合色噜噜狠狠| 久久久美女毛片| 欧美日韩国产综合视频在线观看| 国产高清精品网站| 奇米影视7777精品一区二区| 中文字幕在线一区免费| 精品卡一卡二卡三卡四在线| 在线视频一区二区免费| 国产.欧美.日韩| 奇米一区二区三区| 亚洲电影在线免费观看| 国产精品成人免费精品自在线观看| 日韩亚洲欧美中文三级| 91婷婷韩国欧美一区二区| 精品午夜一区二区三区在线观看| 亚洲综合色成人| 亚洲欧洲日本在线| 国产性天天综合网| 日韩亚洲欧美一区二区三区| 欧美日韩精品一区视频| 99精品一区二区三区| 韩国女主播一区二区三区| 日韩av不卡一区二区| 一区二区不卡在线视频 午夜欧美不卡在| 久久久久国产精品人| 日韩欧美一区二区免费| 91精品国产91久久综合桃花| 欧美在线观看一二区| 99综合电影在线视频| 国产成人亚洲精品青草天美| 国产毛片精品一区| 国产麻豆成人精品| 国产精品996| 国产麻豆成人传媒免费观看| 久久99精品久久久久久久久久久久| 亚洲成人综合网站| 亚洲一区二区在线视频| 亚洲一级片在线观看| 一区二区成人在线| 亚洲一区在线电影| 亚洲成av人片| 水野朝阳av一区二区三区| 亚洲成年人影院| 日韩av中文字幕一区二区三区| 日韩精品亚洲专区| 老司机精品视频一区二区三区| 蜜桃久久av一区| 久久 天天综合| 男女男精品视频网| 国产综合久久久久久久久久久久| 免费高清在线一区| 激情伊人五月天久久综合| 国产成人亚洲精品狼色在线| 成人福利视频网站| 色美美综合视频| 欧美日韩精品欧美日韩精品一| 91麻豆精品国产91久久久久久久久 | 91精品国产色综合久久| 欧美一二三四区在线| 久久亚洲精华国产精华液| 久久精品一区二区三区不卡 | 国产精品久久久久影院| 中文字幕一区二区三区四区| 一区二区免费视频| 麻豆国产欧美日韩综合精品二区 | 国产精品免费看片| 亚洲色图色小说| 日韩电影免费在线看| 国产一区二区三区美女| 成人精品一区二区三区四区| 欧美午夜精品一区二区三区 | 国产福利91精品一区二区三区| www.亚洲在线| 欧美三级日韩在线| 精品国产制服丝袜高跟| 中文字幕一区二区三区不卡| 五月婷婷综合激情| 成人激情免费视频| 欧美精品久久99| 国产午夜精品久久久久久久| 夜夜嗨av一区二区三区| 久久97超碰色| 在线亚洲免费视频| 26uuu精品一区二区在线观看| 亚洲视频一区二区在线| 强制捆绑调教一区二区| 99re热这里只有精品视频| 91.com在线观看| 中文字幕中文字幕一区| 久久www免费人成看片高清| 99re视频精品| 久久品道一品道久久精品| 亚洲成av人片在www色猫咪| 国产福利一区二区| 日韩一区二区在线播放| 一区二区三区四区蜜桃| 国产精品亚洲一区二区三区在线 | 色综合久久中文综合久久97| 日韩欧美专区在线| 亚洲一区视频在线观看视频| 成人v精品蜜桃久久一区| 欧美一区二区黄色| 亚洲免费高清视频在线| 国产精品一级黄| 日韩欧美在线影院| 亚洲国产日韩a在线播放性色| 国产精品系列在线播放| 日韩亚洲欧美一区二区三区| 香蕉影视欧美成人| 91丨九色丨黑人外教| 国产欧美精品在线观看| 狠狠色狠狠色综合| 欧美一级二级三级乱码| 亚洲成av人片在线| 欧美无砖砖区免费| 亚洲激情六月丁香| 97精品电影院| 中文字幕亚洲视频| 97久久精品人人做人人爽| 国产三区在线成人av| 国产激情视频一区二区在线观看 | 国产成人免费视频精品含羞草妖精| 制服丝袜av成人在线看| 亚洲一级二级在线| 欧美亚洲尤物久久| 亚洲亚洲人成综合网络| 欧美日韩中文国产| 亚洲成人综合在线| 91麻豆精品国产自产在线| 午夜一区二区三区在线观看| 日本韩国欧美三级| 亚洲影院久久精品| 欧美网站大全在线观看| 亚洲国产日日夜夜| 555www色欧美视频| 日本欧美久久久久免费播放网| 欧美精品在线观看播放| 日韩黄色免费网站| 欧美大片日本大片免费观看| 毛片av一区二区| 久久综合色播五月| 国产a级毛片一区| 国产精品成人在线观看| 色老汉av一区二区三区| 偷拍自拍另类欧美| 2022国产精品视频| 懂色av一区二区夜夜嗨| 日韩美女视频一区二区| 欧美色综合网站| 免费在线观看精品| 国产欧美精品国产国产专区| 成人不卡免费av| 香蕉加勒比综合久久| 精品国产第一区二区三区观看体验 | 国产精品久久影院| 色婷婷久久久综合中文字幕 | 亚洲精品国产一区二区精华液| 欧美在线一区二区| 国精品**一区二区三区在线蜜桃|