Как использовать цикл for для вставки / изменения нескольких столбцов в таблице?

Я хочу вставить десять столбцов в таблицу в процедуре SQL HANA.

Вот что я сделал, и мне это кажется вполне нормальным, но по какой-то причине система выдает синтаксическую ошибку.

Что я хочу: 10 новых столбцов с именами Col_1, _2 _.._ 3_, каждый типа INT.

BEGIN
--DECLARE arr INT ARRAY ;
DECLARE i INT ;
DECLARE str1 STRING;
DECLARE str2 STRING;

str1:= 'Col_';


for i in 1 ..10 do 
     str2 := :str1 || :i;
     exec 'ALTER TABLE "Table_Name" ADD (:str2 INT)';
end for;



END;

Я попытался использовать ту же команду alter, введя имя столбца в ADD () вместо использования переменной, и она работает нормально.


person Muskaan    schedule 11.09.2017    source источник
comment
Почему именно вы хотите сделать что-то подобное ...? Это кажется слишком большим трудом, если вы можете просто скопировать / вставить оператор ALTER TABLE 10 раз ...   -  person Siyual    schedule 11.09.2017
comment
Существует требование динамически создавать столбцы, и количество столбцов будет определяться какой-либо другой переменной. На самом деле мне нужно разделить строковые значения с разделителями-запятыми (которые снова являются динамическими) на столбцы.   -  person Muskaan    schedule 11.09.2017
comment
Значит, вы собираетесь добавлять 10 столбцов в эту убогую таблицу каждый раз при запуске этой процедуры? Вам следует серьезно пересмотреть структуру своей базы данных ... это не выдерживает самоутверждения.   -  person Siyual    schedule 11.09.2017
comment
Нет. Добавление будет только один раз. Позвольте мне попытаться объяснить это еще раз. У меня есть следующие поля: | (a, b, c) (d, e, g, f) (r, t, y, ...., k) случайное количество значений, разделенных запятыми. Итак, что мне нужно сделать, так это создать максимальное количество столбцов на основе этого и заполнить соответствующие отдельные поля.   -  person Muskaan    schedule 11.09.2017
comment
Это изменение можно было внести в базу данных, выполнив 10 операторов alter за время, необходимое для публикации этого сообщения ...   -  person Jacob H    schedule 11.09.2017
comment
Чувак. Значение не зафиксировано на 10. Я просто взял номер, чтобы посмотреть, работает ли код.   -  person Muskaan    schedule 11.09.2017
comment
@Muskaan Если это одноразовая вещь, зачем вам для этого нужна хранимая процедура? Почему этого нельзя сделать с помощью 10 альтернативных заявлений? Количество столбцов значения не имеет. Я не пытаюсь спорить, просто пытаюсь указать, что это очень похоже на Проблема XY. Похоже, что либо а) вы делаете это намного сложнее, чем должно быть. Или б) вы планируете добавлять в эту таблицу все больше и больше столбцов для размещения дополнительных записей (когда вам следует использовать для этого таблицу-мост).   -  person Siyual    schedule 11.09.2017
comment
Перефразирую еще раз. У меня есть столбец со строкой значений в поле. Скажите, (a, b, c, d) в 1-м, (a, b, c) во 2-м, (a, b) в 3-м. Я хочу разбить эти значения на новые столбцы. Теперь максимальное количество строк в любом столбце будет определять, сколько новых столбцов будет создано, что зависит от входящих данных. Надеюсь, ты понял это сейчас.   -  person Muskaan    schedule 11.09.2017


Ответы (1)


Похоже на плохой дизайн схемы, в любом случае попробуйте объединить его:

BEGIN
--DECLARE arr INT ARRAY ;
DECLARE i INT ;
DECLARE str1 STRING;
DECLARE str2 STRING;
DECLARE str3 STRING;

str1:= 'Col_';

for i in 1 ..10 do 
     str2 := :str1 || :i;
     str3 := 'ALTER TABLE "Table_Name" ADD ('|| :str2 ||' INT)';
     exec str3;
end for;

END;

Если это один раз, я бы просто использовал явные множественные операторы alter:

ALTER TABLE "Table_Name" ADD (Col_1 INT);
ALTER TABLE "Table_Name" ADD (Col_2 INT);
ALTER TABLE "Table_Name" ADD (Col_3 INT);
--...
ALTER TABLE "Table_Name" ADD (Col_10 INT);
person Lukasz Szozda    schedule 11.09.2017
comment
Конечно, позволь мне попробовать. Почему это плохой дизайн? - person Muskaan; 11.09.2017
comment
@Muskaan Структура таблицы должна быть исправлена ​​и изменена при необходимости (но не во время выполнения). В этом сценарии похоже, что вы пытаетесь добавить столбцы за день / год / клиент / регион / .... - person Lukasz Szozda; 11.09.2017
comment
Нет Нет Нет, это будет один раз. Я уже упоминал точный сценарий в приведенном выше комментарии. Скажите, пожалуйста, есть ли у вас альтернатива получше. - person Muskaan; 11.09.2017
comment
Между прочим, такая же синтаксическая ошибка, когда я запускаю приведенный выше код. - person Muskaan; 11.09.2017
comment
@Muskaan Попробовать - person Lukasz Szozda; 11.09.2017
comment
Точно такая же ошибка. : / Проблема в том, что ADD () не принимает переменную. - person Muskaan; 11.09.2017
comment
@Muskaan Попробуй в последний раз. Отсутствует скобка - person Lukasz Szozda; 11.09.2017
comment
Потрясающе! .. Наконец-то заработало. Что именно здесь происходило? : D - person Muskaan; 11.09.2017
comment
@Muskaan Я только что объединил всю строку SQL. Это не самый красивый подход, но он должен работать. - person Lukasz Szozda; 11.09.2017
comment
Кроме того, действительно ли это плохой дизайн? Какой у меня альтернативный процесс? - person Muskaan; 11.09.2017