描述我想做的事情:
我有2个环境,一个有数据(X)第二个没有数据(Y)。
我已经完成了具有输入参数P_TableName的过程。它应检查此表中是否有任何数据和IF然后我们将数据带到Y环境。
所以它大部分都有效,但我有一个简单的事情有问题(我在TD方面没有多少经验,但在Oracle中它将是10秒)。
我需要将选择计数(*)从X传递给变量怎么做?。
我在尝试使用SET VAR = SELECT ... 插入VAR SELECT ... 我试图为直接执行的语句创建一个变量
SET v_sql_stmt = 'INSERT INTO ' || VAR|| ' SELECT COUNT(*) FROM ' || P_TableName;
CALL DBC.SYSEXECSQL(v_sql_stmt);
这可能是非常简单的事情,但我找不到好的解决方案。请帮忙
答案 0 :(得分:1)
您必须打开游标才能获取结果,因为您正在运行动态SQL。 Teradata help doc on Dynamic 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;
答案 1 :(得分:1)
您无法在Teradata中的动态SQL中使用INTO
。
作为一种解决方法,您需要执行返回单行的游标:
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;