2017-04-20 53 views
0

我想寫一個過程,其中數據庫名是動態的,並從where子句獲取。 到目前爲止,我得到這個:動態遊標和WHERE子句Teradata

CREATE PROCEDURE Test 

(IN DBName VARCHAR(100), OUT RowCount DEC(10,2)) 

BEGIN 

DECLARE SqlStr VARCHAR(1000); 

DECLARE C1 CURSOR FOR S1; 

SET SqlStr = 'SELECT count(*) FROM '|| DBNAME || '.MyTable '; 

PREPARE S1 FROM SqlStr; 

OPEN C1 USING DBName; 

FETCH C1 INTO RowCount; 

CLOSE C1; 

END; 

我現在需要增加這樣的:

WHERE DBName = (SELECT 'firstpart||EnvName||' FROM EnvTable 
WHERE EnvName = (SELECT EnvName FROM EnvTable WHERE Flag = 1 AND Priority = (SELECT MIN(Priority) FROM EnvTable)) 

任何想法?我在調用過程時可以添加這個嗎?

+1

所以你想做[存儲過程中的動態SQL](http://www.info.teradata.com/htmlpubs/DB_TTU_14_00/index.html#page/SQL_Reference/B035_1141_111A/ch03.105.042.html)? – Andrew

回答

0

聽起來像是你只需要一個變量來使這更動態:

CREATE PROCEDURE Test 

(OUT RowCount DEC(10,2)) 

BEGIN 

    DECLARE SqlStr VARCHAR(1000); 
    DECLARE DBName VARCHAR(100); 
    DECLARE C1 CURSOR FOR S1; 

    /*Get your DBName variable loaded using SELECT INTO*/ 
    SELECT 'firstpart' || EnvName INTO DBName 
    FROM EnvTable 
    WHERE Flag = 1 AND Priority = (SELECT MIN(Priority) FROM EnvTable); 

    /*and continue what you were doing*/ 
    SET SqlStr = 'SELECT count(*) FROM '|| DBName || '.MyTable '; 

    PREPARE S1 FROM SqlStr; 

    OPEN C1 USING DBName; 

     FETCH C1 INTO RowCount; 

    CLOSE C1; 

END; 

我不知道你試圖用firstpart||envname做,但是這應該讓你在球場。基本上你只需要製作一個sql語句,使你的dbname變量,然後在第二個查詢中使用它。

+0

非常感謝,這非常有幫助:) – Barbara