Sql 动态游标和WHERE子句Teradata

Sql 动态游标和WHERE子句Teradata,sql,parameters,cursor,teradata,Sql,Parameters,Cursor,Teradata,我试图编写一个过程,其中数据库名是动态的,并且取自where子句。 到目前为止,我已经做到了: 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 '; P

我试图编写一个过程,其中数据库名是动态的,并且取自where子句。 到目前为止,我已经做到了:

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))

有什么想法吗?我可以在调用过程时添加这个吗?

听起来您只需要一个变量就可以使其更具动态性:

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
变量成为变量,然后在第二次查询中使用它。

您想这样做吗?非常感谢,这非常有用:)