EXECUTE STATEMENT語句的用法(譯) |
以下是筆者根據(jù)FB1.5文檔譯過來的. EXECUTE STATEMENT語句是一個動態(tài)執(zhí)行的sql語句的語句,用在存儲過程與觸發(fā)器中.他相當(dāng)于MS SQLSERVER中的exec 語句,不過他比該語句用法豐富,在ms sql中如要實現(xiàn)后面兩種EXECUTE STATEMENT語句的功能,必須用exec +游標(biāo)來實現(xiàn).他有三種典型的用法. 第一種:語法如下:EXECUTE STATEMENT <string>; <string>就指是sql語句. 樣例如下: CREATE PROCEDURE DynamicSampleOne (Pname VARCHAR(100)) AS DECLARE VARIABLE Sql VARCHAR(1024);--定義字符型變量,長度1024 DECLARE VARIABLE Par INTEGER;--定義整形變量Par BEGIN SELECT MIN(SomeField) FROM SomeTable INTO :Par;--把Sometalbe中somefied最小值的列---賦給par Sql = ’EXECUTE PROCEDURE ’ || Pname || ’(’; Sql = Sql || CAST(Par AS VARCHAR(20)) || ’)’; EXECUTE STATEMENT Sql;--把存儲過程名當(dāng)參數(shù)來動態(tài)執(zhí)行 END
第二種,語法如下: EXECUTE STATEMENT <string> INTO :var1, […, :varn] ; 舉個例子,我自已寫的一個過程用的: CREATE PROCEDURE FIN_FUN0021 ( TABLENAME VARCHAR(20))--傳入表名 RETURNS ( NEWKEY BIGINT)--返回這個表的主K的最新值(我建的表所有的主K都有整形) AS DECLARE VARIABLE BASNUM INTEGER; DECLARE VARIABLE CURRSHOPID INTEGER; DECLARE VARIABLE STRMK VARCHAR(50); DECLARE VARIABLE NEWMAXKEY BIGINT; DECLARE VARIABLE STRSQL VARCHAR(250); BEGIN execute procedure FIN_FUN0026('BASNUM') Returning_values (BASNUM);--增長的步長 execute procedure FIN_FUN0026('SHOPID') Returning_values (CurrShopID); --分店號 /*得到傳來的表格的主K名*/ select first 1 A.RDB$FIELD_NAME FROM RDB$INDEX_SEGMENTS A, RDB$RELATION_CONSTRAINTS B WHERE B.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY' AND UPPER(B.RDB$RELATION_NAME) = UPPER(:TableName) AND A.RDB$INDEX_NAME = B.RDB$INDEX_NAME ORDER BY A.RDB$FIELD_POSITION into :STRMK; if (STRMK IS NOT NULL) then -- 為防止沒有主K的情形出現(xiàn)。 BEGIN STRMK=uf_trim(STRMK);--uf_trim為主定義函數(shù),相當(dāng)于delphi的trim /*得到當(dāng)前主K的最大值 */ STRSQL='SELECT CAST(MAX(' ||STRMK|| ')' ||' AS bigint) from ' ||TableName ; execute STATEMENT STRSQL INTO :NewMaxKey ; if(NewMaxKey is NULL) then --如果主K是空值 begin NEWKEY = CURRSHOPID; end else --不是空的. NEWKEY = NewMaxkey+BASNUM; END SUSPEND; END 第三種形式:語法: FOR EXECUTE STATEMENT <string> INTO :var1, …, :varn DO <compound-statement>; 例子: /*傳入表與廣本字段,得到該表中該字段的所有數(shù)據(jù)*/ CREATE PROCEDURE DynamicSampleThree ( TextField VARCHAR(100), TableName VARCHAR(100)) RETURNS (Line VARCHAR(32000)) AS DECLARE VARIABLE OneLine VARCHAR(100); BEGIN Line = ’’; FOR EXECUTE STATEMENT ’SELECT ’ || TextField || ’ FROM ’ || TableName INTO :OneLine DO IF (OneLine IS NOT NULL) THEN Line = Line || OneLine || ’ ’; SUSPEND; END
|
|