Переменные хранимой процедуры Teradata - PullRequest
0 голосов
/ 28 октября 2019

Я пытаюсь создать хранимую процедуру, чтобы создать все возможные комбинации таблицы с самим собой. Пока я получил этот код, но он выдает следующую ошибку:

Синтаксическая ошибка: ожидается что-то между словом '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', чтобы создать несколько псевдонимов для всех кросс-таблиц.

Ответы [ 2 ]

0 голосов
/ 28 октября 2019

Используйте явные 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;
0 голосов
/ 28 октября 2019

Ваша 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...