Я бы пошел по маршруту @ AP C и использовал бы запрос USER_TAB_COLUMNS
для создания необходимых SQL:
CREATE TABLE t (col1 VARCHAR2(5), col2 NUMBER, col3 VARCHAR2(30),
col4 VARCHAR2(7), col5 DATE, col6 VARCHAR2(200));
SELECT column_name
FROM user_tab_columns
WHERE table_name = 'T'
AND column_name <> 'COL6';
COL1
COL2
COL3
COL4
COL5
Теперь вы можете объединить их с помощью LISTAGG :
SELECT LISTAGG(column_name, '||'',''||')
WITHIN GROUP (ORDER BY column_id) AS sql
FROM user_tab_columns
WHERE table_name = 'T'
AND column_name <> 'COL6';
COL1||','||COL2||','||COL3||','||COL4||','||COL5
Теперь я бы скопировал и вставил это в соответствующий запрос, fi
UPDATE t
SET col6 = COL1||','||COL2||','||COL3||','||COL4||','||COL5;
Чтобы объединить столбцы, их нужно преобразовать в VARCHAR2. Oracle пытается автоматическое преобразование c типа данных. Вы должны проверить, работает ли это и достаточно ли это для вас. В числах могут быть начальные пробелы, запятая или десятичная точка, для дат может потребоваться строка формата et c.
Вы можете подумать о том, чтобы сделать это в следующих строках:
SELECT column_name,
CASE WHEN data_type IN ('NUMBER','FLOAT')
THEN 'TO_CHAR('||column_name||')'
WHEN data_type IN ('DATE')
THEN 'TO_CHAR('||column_name||',''YYYY-MM-DD'')'
ELSE column_name
END AS cstr
FROM user_tab_columns
WHERE table_name = 'T'
AND column_name <> 'COL6';
COL1 COL1
COL2 TO_CHAR(COL2)
COL3 COL3
COL4 COL4
COL5 TO_CHAR(COL5,'YYYY-MM-DD')
В зависимости от В ваших обстоятельствах вы можете использовать виртуальный столбец вместо копирования реальных данных:
ALTER TABLE t DROP COLUMN col6;
ALTER TABLE t ADD (col6 NUMBER GENERATED ALWAYS
AS (COL1||','||COL2||','||COL3||','||COL4||','||COL5));