2015-01-26 32 views
1

我們測試D5項目(使用IB 2009 Server和IBProvider)到XE6的遷移,將同一臺IB服務器保留爲ADO提供程序。該項目大量使用存儲過程(SP)。在創建數據庫(用IB API編程)後,在創建(使用TAdoQuery)表,異常和聲明(也包含TAdoQuery)幾個UDF之後,我們在兩遍中創建了SP(仍然帶有TAdoQuery)。如何將TAdoQuery用於ALTER IB存儲過程

pass 1.使用SQL命令CREATE PROCEDURE,我們創建了所有帶有瑣碎主體的SP,例如,

PROCEDURE "SP_WITH_PARAMETERS"("IN_PARAM" VARCHAR(5)) 
RETURNS ("OUT_PARAM" VARCHAR(5)) 
AS 
BEGIN 
    EXIT; <-- trivial body 
END; 

通2.使用ALTER PROCEDURE,每個SP被賦予其適當的身體,例如

PROCEDURE "SP_WITH_PARAMETERS"("IN_PARAM" VARCHAR(5)) 
RETURNS ("OUT_PARAM" VARCHAR(5)) 
AS 
BEGIN 
    SELECT MAX(C_CODE) 
    FROM CODES 
    WHERE C_CODE < :IN_PARAM 
    INTO :OUT_PARAM; 
END; 

對於任何人誰願意做一個測試:在這個特殊的身體簡稱表碼的元數據,是

CREATE TABLE "CODES" 
("C_CODE" VARCHAR(5) NOT NULL, 
PRIMARY KEY ("C_CODE")); 

兩個通行證克服的SP間的障礙依賴。

在D5中,有必要尊重在TAdoQuery.SQL中使用的醜陋「約定」,即雙冒號(而不是冒號),用於在SP主體內發生的SQL命令中引用的SP參數的前綴。想象一下上面的SP - 它的整體是一個單一的SQL命令 - 其冒號增加了一倍。那是在D5中,SPs的創作「如預期」般奏效,無論「醜陋」慣例的細節如何。我們很快注意到,在那種特殊情況下 - 讓我們稱之爲「帶參數的SP」(SPWP) - 我們的D5方法失敗了,因爲IB不允許雙冒號(可能)在D5中預處理。不幸的是,在TAdoQuery.Sql中使用簡單的冒號,我們沒有達到目標。我們得到

EOleException 
ErrorCode=-2146824580 ($800A0E7C) 
Msg=<"Parameter object is improperly defined. Inconsistent or incomplete information was provided" 

這表明現在ADO會變得不滿意。

問: 如何使用TAdoQuery和SQL命令ALTER PROCEDURE,可以第一上述SP的改變到第二個?

+0

我的第一個猜測是查詢準備了一個參數:'OUT_PARAM'。所以我第一次嘗試將查詢對象的'ParamCheck'變成False。 – TLama 2015-01-26 18:40:01

+0

您是否需要切換終結器以防止早期執行語句?像'SET TERM ^;'之前和'SET TERM; ^'之後? – 2015-01-26 18:48:36

+0

@TLama。我使用ParamCheck:= false – jkomorowski 2015-01-26 19:02:58

回答

1

將SQL分配給代碼中的TAdoQuery時,請確保在之前分配SQL語句前已設置ParamCheck := False。否則,Params列表仍將填充。

+1

這就是['OP確認我'](http://stackoverflow.com/questions/28156396/how-to-use-tadoquery-to-alter-ib-stored-procedure#comment44685052_28156396)。 – TLama 2015-01-27 13:01:08