Teradata存储过程变量

时间:2019-10-28 12:22:33

标签: sql variables stored-procedures teradata teradata-sql-assistant

我正在尝试创建一个存储过程,以创建表与其自身的所有可能组合。现在,我得到了这段代码,但是它产生了以下错误:

  

语法错误:单词'A'和整数'2'之间应该有一些

代码:

CREATE MULTISET TABLE PRUEBA
(
    CAMPO VARCHAR(10)
);

INSERT INTO PRUEBA VALUES('A');
INSERT INTO PRUEBA VALUES('B');
INSERT INTO PRUEBA VALUES('C');

REPLACE PROCEDURE TEST()

BEGIN
   DECLARE a VARCHAR(255);
   DECLARE b VARCHAR(225);
   DECLARE qry VARCHAR(255);
   DECLARE i INT;
   DECLARE n INT;

   SET a = 'SELECT * FROM PRUEBA A1 ';
   SET b = ' WHERE ';
   SET n = 3;
   SET i = 1;

   WHILE i < n DO
      BEGIN
         CASE i
         WHEN 1 THEN
            SET qry = a;
         WHEN 2 THEN
            SET a = a || 'CROSS JOIN PRUEBA A' || i ; -- Error in this part.
            SET b = b || 'A' || (i-1) || '.CAMPO < A' || i || '.CAMPO';
            SET qry = a || b;
         ELSE
            SET a = a || 'CROSS JOIN PRUEBA A' || i ;
            SET b = b || 'AND A' || (i-1) || '.CAMPO < A' || i || '.CAMPO';
            SET qry = a || b;
         END CASE;
         SET i = i + 1;
      END;
   END WHILE;
   EXECUTE IMMEDIATE qry;
END;

CALL TEST();

我将加入'i'变量来为所有交叉表创建多个别名。

3 个答案:

答案 0 :(得分:0)

您的i变量是INTEGER。进行串联时,尝试将其转换为VARCHAR()

SET a = a || 'CROSS JOIN PRUEBA A' || CAST(i AS VARCHAR(2)) ; -- Error in this part.
SET b = b || 'A' || CAST((i-1) AS VARCHAR(2)) || '.CAMPO < A' || 
  CAST(i AS VARCHAR(2)) || '.CAMPO';

您还必须在随后的ELSE块中执行此操作。

答案 1 :(得分:0)

使用显式CAST或TRIM来避免因从INTEGER隐式转换为VARCHAR而产生的前导空格。而且,您需要使用动态游标将SELECT的结果返回给调用方。

REPLACE PROCEDURE TEST()
   DYNAMIC RESULT SETS 1 --Allow returning data to caller
BEGIN
   DECLARE a VARCHAR(255);
   DECLARE b VARCHAR(225);
   DECLARE qry VARCHAR(4096);
   DECLARE i INT;
   DECLARE n INT;
   DECLARE csr1 CURSOR WITH RETURN FOR stmt1; --Declare a dynamic cursor

   SET a = 'SELECT * FROM PRUEBA A1 ';
   SET b = ' WHERE ';
   SET n = 3;
   SET i = 1;

   WHILE i < n DO
      BEGIN
         CASE i
         WHEN 1 THEN
            SET qry = a;
         WHEN 2 THEN
            SET a = a || 'CROSS JOIN PRUEBA A' || TRIM(i) ;
            SET b = b || 'A' || TRIM(i-1) || '.CAMPO < A' || TRIM(i) || '.CAMPO';
            SET qry = a || b;
         ELSE
            SET a = a || 'CROSS JOIN PRUEBA A' || TRIM(i) ;
            SET b = b || 'AND A' || TRIM(i-1) || '.CAMPO < A' || TRIM(i) || '.CAMPO';
            SET qry = a || b;
         END CASE;
         SET i = i + 1;
      END;
   END WHILE;
   PREPARE stmt1 FROM qry; --Prepare a dynamic SQL statement for the cursor
   OPEN csr1; --Execute the SELECT statement
   --Leave a WITH RETURN cursor open to return the result set
END;

答案 2 :(得分:0)

如果您使用的是bteq,则可能必须将该过程写入文件,然后使用.compile指令加载该过程。 登录后并假设文件为/tmp/stored_procedure.sql 像这样编译它: .compile file ='/ tmp / stored_procedure.sql';