2017-04-20 27 views
0

databasenameが動的で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をどうしようとしていたかわからないんだけど、これは球場であなたを取得する必要があります。基本的には、dbnameという変数を作成して2番目のクエリで使用するSQL文を作成するだけで済みます。

+0

ありがとう、これは非常に有用だった:) – Barbara