Oracle пакетно изменяет тип поля varchar2 (2000) на clob

фон

Обычно используется база данных 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 после него.

После модификации на этом закончим.

удачного дня.

Guess you like

Origin blog.csdn.net/u012869793/article/details/126447569