Динамические курсоры и предложение WHERE 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 ';

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

Любые идеи? Могу ли я добавить это при вызове процедуры?


person Barbara    schedule 20.04.2017    source источник
comment
Итак, вы хотите сделать динамический SQL в хранимой процедуре?   -  person Andrew    schedule 20.04.2017


Ответы (1)


Похоже, вам просто нужна переменная, чтобы сделать это более динамичным:

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, а затем использовать ее во втором запросе.

person JNevill    schedule 20.04.2017
comment
Большое спасибо, это было очень полезно :) - person Barbara; 21.04.2017