Есть ли какой-либо (возможно, специфичный для Oracle) способ заранее узнать, будет ли данное изменение ALTER TABLE успешным и не завершится ошибкой из-за слишком длинных значений
Я бы сказал, что это не очень хороший дизайн, когда вам нужно создавать/изменять объекты базы данных на лету. При этом, если DDL дает сбой, с ним будет связана ORA-ошибка. Вам нужно повторить попытку с необходимыми изменениями. Изменение таблицы — это не обычное дело, вы создаете таблицу один раз, а затем изменяете ее только тогда, когда это необходимо для бизнеса, и вам нужно пройти выпуск, чтобы приложение не пострадало. Итак, мне интересно, как это поможет вам узнать до выполнения, будет ли DDL успешным или нет? Если ваш инструмент выполняет эти модификации, он должен обрабатывать их программно. Перед изменением проверьте тип и размер столбцов.
Если вы делаете это с помощью внешнего скрипта, вам нужно построить собственную логику. Вы можете использовать представления метаданных, такие как user_tab_columns, чтобы проверить data_type, data_size, data_precision, data_scale и т. д.
Небольшой пример логики проверки размера типа данных VARCHAR2 перед выполнением оператора ALTER (для демонстрации я делаю это на PL/SQL, вы можно применить аналогичную логику в вашем скрипте или инструменте):
SQL> CREATE TABLE t (A VARCHAR2(10));
Table created.
SQL> DESC t;
Name Null? Type
----------------------------------------- -------- ----------------------------
A VARCHAR2(10)
SQL> SET serveroutput ON
SQL> DECLARE
2 v_type VARCHAR2(20);
3 v_size NUMBER;
4 new_size NUMBER;
5 BEGIN
6 new_size:= 20;
7 SELECT data_type,
8 data_length
9 INTO v_type,
10 v_size
11 FROM user_tab_columns
12 WHERE table_name='T';
13 IF v_type ='VARCHAR2' THEN
14 IF new_size > v_size THEN
15 EXECUTE IMMEDIATE 'ALTER TABLE T MODIFY A '||v_type||'('||new_size||')';
16 DBMS_OUTPUT.PUT_LINE('Table altered successfully');
17 ELSE
18 DBMS_OUTPUT.PUT_LINE('New size should be greater than existing data size');
19 END IF;
20 END IF;
21 END;
22 /
Table altered successfully
PL/SQL procedure successfully completed.
Итак, таблица успешно изменена, давайте проверим:
SQL> DESC t;
Name Null? Type
----------------------------------------- -------- ----------------------------
A VARCHAR2(20)
SQL>
Я видел несколько приложений, использующих скрипт groovy, который выполняет всю проверку и подготавливает операторы ALTER на основе проверок data_type, data_size, data_precision, data_scale и т. д.
Для разных проверок нужно добавить больше блоков IF-ELSE
. Это был один из примеров увеличения размера типа данных VARCHAR2. Вам нужно создать исключение при уменьшении размера столбца, в зависимости от того, есть ли в столбце какие-либо существующие данные или нет... и так далее. .
Вы можете создать отдельные функции для проверки метаданных и возврата значения.
Например,
Числовые типы:
CREATE OR REPLACE FUNCTION is_numeric (i_col_name)...
<using the above logic>
IF v_type ='NUMBER' THEN
<do something>
RETURN 1;
Типы персонажей:
CREATE OR REPLACE FUNCTION is_string (i_col_name)...
<using the above logic>
IF v_type ='VARCHAR2' THEN
<do something>
RETURN 1;
person
Lalit Kumar B
schedule
03.06.2015