我們測試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的改變到第二個?
我的第一個猜測是查詢準備了一個參數:'OUT_PARAM'。所以我第一次嘗試將查詢對象的'ParamCheck'變成False。 – TLama 2015-01-26 18:40:01
您是否需要切換終結器以防止早期執行語句?像'SET TERM ^;'之前和'SET TERM; ^'之後? – 2015-01-26 18:48:36
@TLama。我使用ParamCheck:= false – jkomorowski 2015-01-26 19:02:58