Какое отличие типа данных от подтипа?
Не нашел четкого объяснения, в чем все-таки заключается разница между объявлением переменной с типом данных от объявлениея с подтипом?
В чем, например, разница, если я объявлю переменную с типом varchar2 или переменную с подтипом, созданным от varchar2?
Ответы (2 шт):
Подтип данных, объявленый от базового типа данных (может в свою очередь быть подтипом), это своего рода синоним базового типа данных, другими словами, другое имя для базового типа данных.
Разницы в производительности или затрачиваемых ресурсах, не будет. Есть некоторые тонкости при неявном конвертировании из подтипа в его базовый тип данных и наоборот, см. документацию по ссылке ниже.
В документации действительно не очень развернуто пояснено:
Subtypes can:
- Provide compatibility with ANSI/ISO data types
- Show the intended use of data items of that type
- Detect out-of-range values
По моему мнению, более подходит среднее из списка, показать, с какой целью подтип будет использоватся. Например, если символьная переменная не нуждается в ограничении, не писать же всюду varchar2 (32767), или ещё хуже, по принциипу: "вроде всё влезет" - varchar2 (100). Или, разве должен разработчик задумаваться, что значит префикс sys_ при объявлении переменной курсора - это что-то глобальное для всех или только для тех, кто имеет системные привилегии.
Само собой напрашивается желание создать синоним или дать псевдоним (alias).
Такой пример, чтобы проиллюстрировать изложенное выше:
declare
subtype longVarchar is varchar2 (32767);
subtype tennerRange is pls_integer range 1..10;
subtype refcursor is sys_refcursor;
ls longvarchar := rpad ('ABC', 32767, 'X');
tr tennerrange := 1;
rc refcursor;
begin
open rc for select length (ls) len, tr tenner from dual;
dbms_sql.return_result (rc);
end;
/
PL/SQL procedure successfully completed.
LEN TENNER
-------- --------
32767 1
Подтипы полезны тогда, когда вы создаёте большую программу и не уверены, что какой-то тип данных потом (в процессе разработки) не будет изменён.
Сделаете вы его скажем varchar2(10). Создадите 100 переменных в 50 пакетах. А потом решите, что теперь нужен varchar2(20). Менять все 100 переменных в 50 пакетах муторно и неудобно.
Поэтому, объявите тип subtype mytype varchar(10), и везде используйте его. И если нужно изменить на varchar2(20), то меняешь только в одном месте.
Тут вопрос: почему здесь используется ключевое слово subtype, а не type? Потому что нельзя написать type mytype varchar(10), будет ошибка, т.к. type используется для описания новых пользовтельских типов.