Teradata Вставить количество в переменную

Описание того, что я пытаюсь сделать:

У меня есть 2 среды, в одной есть данные (X), во второй нет данных (Y).

Я сделал процедуру, которая имеет входной параметр P_TableName. Он должен проверить, есть ли в этой таблице какие-либо данные, и если есть, то мы перенесем данные в среду Y.

Так что в основном это работает, но у меня есть проблема с одной чертовски простой вещью (у меня не так много опыта в TD, но в Oracle это будет 10 секунд).

Мне нужно передать select count(*) из X в переменную, как это сделать?.

Я пытался с помощью SET VAR = SELECT... INSERT INTO VAR SELECT... Я пытался создать переменную для оператора, который непосредственно выполняется

        SET v_sql_stmt = 'INSERT INTO ' || VAR|| ' SELECT COUNT(*) FROM ' || P_TableName;
        CALL DBC.SYSEXECSQL(v_sql_stmt);

Это, вероятно, очень простая вещь, но я не могу найти для этого хорошего решения. Пожалуйста помоги


person Emwi    schedule 07.02.2018    source источник


Ответы (2)


Вам нужно будет открыть курсор, чтобы получить результаты, так как вы используете динамический SQL. Хороший пример приведен в справочный документ Teradata по динамическому SQL:

CREATE PROCEDURE GetEmployeeSalary
(IN EmpName VARCHAR(100), OUT Salary DEC(10,2))
BEGIN
  DECLARE SqlStr VARCHAR(1000);
  DECLARE C1 CURSOR FOR S1;
  SET SqlStr = 'SELECT Salary FROM EmployeeTable WHERE EmpName = ?';
  PREPARE S1 FROM SqlStr;
  OPEN C1 USING EmpName;
  FETCH C1 INTO Salary;
  CLOSE C1;
END;
person JNevill    schedule 07.02.2018

Вы не можете использовать INTO в динамическом SQL в Teradata.

В качестве обходного пути вам нужно сделать курсор, возвращающий одну строку:

DECLARE cnt BIGINT;
DECLARE cnt_cursor CURSOR FOR S;
SET v_sql_stmt = ' SELECT COUNT(*) FROM ' || P_TableName;
PREPARE S FROM v_sql_stmt;
OPEN cnt_cursor;
FETCH cnt_cursor INTO cnt; 
CLOSE cnt_cursor;
person dnoeth    schedule 07.02.2018