Loops 在光标上迭代

Loops 在光标上迭代,loops,stored-procedures,cursor,teradata,Loops,Stored Procedures,Cursor,Teradata,我想使用另一个游标的行作为参数,从select语句创建游标或表。在我的示例中,我得到了一个包含一列和多行的时态表。这些行应该是下一次选择并显示或保存结果的条目 REPLACE PROCEDURE test (IN name_db VARCHAR(25), IN name_table VARCHAR(25), IN n INT) DYNAMIC RESULT SETS 1 BEGIN DECLARE a VARCHAR(32000); DECLARE b VARCHAR(32000); DECLA

我想使用另一个游标的行作为参数,从select语句创建游标或表。在我的示例中,我得到了一个包含一列和多行的时态表。这些行应该是下一次选择并显示或保存结果的条目

REPLACE PROCEDURE test (IN name_db VARCHAR(25), IN name_table VARCHAR(25), IN n INT)
DYNAMIC RESULT SETS 1
BEGIN
DECLARE a VARCHAR(32000);
DECLARE b VARCHAR(32000);
DECLARE qry VARCHAR(32000);
DECLARE prindx VARCHAR(32000);
DECLARE i INT;
DECLARE p VARCHAR(32000);
DECLARE idx VARCHAR(32000);
DECLARE diff VARCHAR(32000);
DECLARE csr1 CURSOR WITH RETURN FOR stmt1;

SET a = 'SELECT * FROM (SELECT ColumnName AS col1 FROM DBC.Columns WHERE DatabaseName=''' ||name_db || ''' AND TableName=''' || name_table || ''') A1 ';
SET b = 'WHERE ';

SET i=1;
WHILE i <=N DO
   BEGIN
      CASE i
      WHEN 1 THEN
         SET qry = a;
         SET prindx = 'SELECT (col1';
      WHEN 2 THEN
         SET a = a || 'CROSS JOIN (SELECT ColumnName AS col' || CAST(i AS VARCHAR(2)) || ' FROM DBC.Columns WHERE DatabaseName='''||name_db || ''' AND TableName=''' || name_table || ''') A' || CAST(i AS VARCHAR(2)) || ' ';
         SET b = b || 'A' || CAST((i-1) AS VARCHAR(2)) || '.col' || CAST((i-1) AS VARCHAR(2)) || ' < A'  || CAST(i AS VARCHAR(2)) || '.col' || CAST(i AS VARCHAR(2));
         SET qry a || b;
         SET prindx = prindx || ' || '','' || col' || CAST(i AS VARCHAR(2));
      ELSE
         SET a = a || 'CROSS JOIN (SELECT ColumnName AS col' || CAST(i AS VARCHAR(2)) || ' FROM DBC.Columns WHERE DatabaseName='''||name_db || ''' AND TableName=''' || name_table || ''') A' || CAST(i AS VARCHAR(2)) || ' ';
         SET b = b || ' AND A' || CAST((i-1) AS VARCHAR(2)) || '.col' || CAST((i-1) AS VARCHAR(2)) || ' < A'  || CAST(i AS VARCHAR(2)) || '.col' || CAST(i AS VARCHAR(2));
         SET qry a || b;
         SET prindx = prindx || ' || '','' || col' || CAST(i AS VARCHAR(2));
      END CASE;
      SET i = i + 1;
   END;
END WHILE;

   BEGIN
      DECLARE exit HANDLER FOR SQLEXCEPTION
      BEGIN
         IF SQLCODE <> 3807 THEN RESIGNAL; END IF;
      END;
      SET p = name_db || '.tbl1 ';
      DROP TABLE p;
   END;

SET p = 'CREATE TABLE ' || name_db || '.tbl1 AS (' || qry || ') WITH DATA';
EXECUTE IMMEDIATE p;

SET prindx = prindx || ') AS PRYINDX FROM ' || name_db || '.tbl1 ';

PREPARE stmt1 FROM prindx;
OPEN csr1;

--------------------------------------------------------------------------------
FETCH csr1 INTO idx;

SET diff = 'SELECT (MAX(A.TOTAL) - MIN(A.TOTAL)) AS DIFF 
FROM (SELECT HASHAMP(HASHBUCKET(HASHROW(' || idx || '))) CODHASH, CAST(COUNT(*) AS DECIMAL(18,0) TOTAL 
FROM ' || name_db || '.' || name_table || ' GROUP BY 1) A';

我想在上面的Select语句中使用csr1的值,并获取所有可能的结果。现在,我只能选最后一个。

不清楚你在问什么。请编辑问题以澄清您看到的错误或您遇到的困难。另外,在最初的帖子中修复一些明显的错误:SELEECT->SELECT和CROSJOIN->CROSJOIN。我只想在最后的SELECT语句中替换光标csr1的每一行,就像idx一样,并保存结果。现在,我只能得到一个,因为您动态提供列、表和数据库名称,所以需要将SQL语句构建为字符串并动态执行。看来你已经开始这么做了。由于该语句是SELECT语句,您需要将其准备为stmt2?并使用第二个动态光标csr2?获取DIFF的值。