简体   繁体   English

Teradata 存储过程变量

[英]Teradata Stored Procedure variables

I'm trying to create a stored procedure to create all possible combination of a table with itself.我正在尝试创建一个存储过程来创建表与其自身的所有可能组合。 For now, I got this code, but it produces the following error:现在,我得到了这段代码,但它会产生以下错误:

Syntax error: expected something between the word 'A' and the integer '2'语法错误:预期单词 'A' 和 integer '2' 之间的内容

Code:代码:

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'd join the 'i' variable to create multiple alias for all cross tables.我会加入“i”变量来为所有交叉表创建多个别名。

Your i variable is an INTEGER .您的i变量是INTEGER Try casting it as a VARCHAR() when you do your concatenations:在进行连接时尝试将其转换为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';

You'll have to do this in the subsequent ELSE block as well.您还必须在随后的ELSE块中执行此操作。

Use explicit CAST or TRIM to avoid the leading blanks generated by implicit cast from INTEGER to VARCHAR.使用显式 CAST 或 TRIM 来避免从 INTEGER 到 VARCHAR 的隐式转换生成的前导空白。 And you need to use a dynamic cursor to return the result of the SELECT to the caller.并且您需要使用动态 cursor 将 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;

if you're using bteq you might have to write the procedure into a file and load it with.compile directive.如果您使用的是 bteq,您可能必须将过程写入文件并使用 .compile 指令加载它。 once you are loggen in and supposing the file is /tmp/stored_procedure.sql compile it like this: .compile file='/tmp/stored_procedure.sql';一旦你登录并假设文件是 /tmp/stored_procedure.sql 像这样编译它: .compile file='/tmp/stored_procedure.sql';

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM