2017-04-20 7 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 변수를 만든 다음 두 번째 쿼리에서이를 사용하는 SQL 문을 작성하면됩니다.

+0

고마워, 이것은 매우 도움이되었다 :) – Barbara