Я думаю, что важно помнить исторический контекст, в котором были созданы реляционные базы данных. В то время, когда они разрабатывались (в конце 70-х - начале 80-х), общедоступные компьютеры были намного меньше (с точки зрения памяти и дискового пространства) и менее мощными (с точки зрения процессора), чем мы сейчас, и управление этими ресурсами было обязательно непреодолимая забота. COBOL был распространенным языком бизнес-вычислений (и до сих пор широко используется), а объектно-ориентированные языки, такие как Smalltalk и C ++, были неизвестны для всех практических целей. В то время ожидалось, что программы будут точно указывать, сколько памяти им потребуется для каждого элемента данных, например, 10 байтов для строки, 2 байта для короткого целого числа, 4 байта для числа с плавающей запятой и т. Д., И поэтому этот стиль объявления использовался недавно разработанными реляционными базами данных. Более того, было сделано предположение о том, что каждый элемент данных будет объявлять (неявно или явно) объем требуемой памяти, и это было закодировано в реляционные механизмы на очень фундаментальном уровне.
Теперь, со временем это требование несколько ослабло, по крайней мере, в том, что касается хранения данных на диске. Я считаю, что в Oracle тип данных NUMBER будет гибко распределять пространство, так что фактически будет использоваться только минимальный объем пространства, необходимый для хранения его значения, и что столбцы VARCHAR2 будут использовать только дисковое пространство для хранения фактических данных без сохранения конечных пробелов, хотя вам все равно нужно указать максимальный объем памяти, необходимый для VARCHAR2.
Вы можете взглянуть на пакет SYS.STANDARD, чтобы получить представление о том, как объявлять подтипы VARCHAR2. Например, если вы хотите свой собственный тип 'string', который вы можете использовать, не используя спецификацию длины, вы можете попробовать:
SUBTYPE MY_STRING IS VARCHAR2(4000);
Однако, будьте осторожны с этим, если вы собираетесь индексировать рассматриваемый столбец (как указывалось ранее @APC).
Я согласен, что я предпочел бы просто иметь возможность объявить STRING (который, BTW, определен в SYS.STANDARD как подтип VARCHAR2) без необходимости объявлять длину, но это не совсем так, как работает Oracle, и поскольку я не собираюсь начинать писать свою собственную реляционную базу данных (у меня есть свои собственные ветряные мельницы, на которые можно наклониться, спасибо :-) Я просто согласен со статус-кво.
Надеюсь, это поможет.