фон
Обычно используется база данных SqlServer, но в разных проектах могут использоваться разные базы данных, поэтому при преобразовании типа поля возникают небольшие проблемы, запишите это.
текст
В SqlServer для сохранения большого текстового содержимого, обычно используемого nvarchar(max)
или Text
типа, может поддерживаться до 2 ГБ хранилища содержимого, но для nvarchar(max)
, если длина хранимого содержимого меньше 8000 байт (4000 двухбайтовых символов), тип на самом деле трактуется как varchar
тип.
Иногда, когда создаются некоторые сценарии, те, что в SqlServer, nvarchar(max)
будут преобразованы в те, что в oracle nvarchar2(2000)
, Если база данных уже используется, тип поля может быть только динамически изменен в это время. Если полей немного, используйте следующий скрипт.
--增加临时新字段
ALTER table 表名 ADD 新字段名 clob;
--复制内容
Update 表名 Set 新字段名 = 旧字段名;
--删除原有字段
ALTER table 表名 drop column 旧字段名;
--修改回原字段名
ALTER table 表名 rename column 新字段名 to 旧字段名;
Основная идея состоит в том, чтобы добавить новое поле, присвоить значение старого поля новому полю, удалить старое поле и изменить имя нового поля на старое поле.
Небольшие советы: если имя таблицы или имя поля не все в верхнем регистре, вам нужно добавить, например, двойные кавычки
"User"
Если полей много, приведенный выше скрипт может быть очень длинным.В настоящее время вы можете рассмотреть возможность использования цикла для решения проблемы.
Во-первых, вам нужно запросить все имена таблиц, имена полей, типы полей и длины полей для указанного пользователя.Утверждение выглядит следующим образом.
select TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_LENGTH from all_tab_columns where OWNER = 'C##STUDENT'
AND DATA_TYPE='VARCHAR2' AND DATA_LENGTH=2000
Результаты запроса следующие, просто для примера.
Затем вы можете объединить два оператора SQL, полный сценарий выглядит следующим образом.
begin
for r in (select TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_LENGTH from all_tab_columns where OWNER = 'C##STUDENT'
AND DATA_TYPE='VARCHAR2' AND DATA_LENGTH=4000) LOOP
--增加临时新字段
execute immediate 'ALTER table "'|| r.TABLE_NAME ||'" ADD "'|| r.COLUMN_NAME ||'1" clob';
--复制内容
execute immediate 'Update "'|| r.TABLE_NAME ||'" Set "'|| r.COLUMN_NAME ||'1" = "'|| r.COLUMN_NAME ||'"';
--删除原有字段
execute immediate 'ALTER table "'|| r.TABLE_NAME ||'" drop column "'|| r.COLUMN_NAME ||'"';
--修改回原字段名
execute immediate 'ALTER table "'|| r.TABLE_NAME ||'" rename column "'|| r.COLUMN_NAME ||'1" to "'|| r.COLUMN_NAME ||'" ';
end loop;
end ;
DATA_TYPE различает
varchar2
иnvarchar2
.
DATA_LENGTH можно изменить по мере необходимости.
Новое имя поля основано на старом имени поля с цифрой 1 после него.
После модификации на этом закончим.
удачного дня.