Какое отличие типа данных от подтипа?

Не нашел четкого объяснения, в чем все-таки заключается разница между объявлением переменной с типом данных от объявлениея с подтипом?

В чем, например, разница, если я объявлю переменную с типом varchar2 или переменную с подтипом, созданным от varchar2?


Ответы (2 шт):

Автор решения: 0xdb

Подтип данных, объявленый от базового типа данных (может в свою очередь быть подтипом), это своего рода синоним базового типа данных, другими словами, другое имя для базового типа данных.

Разницы в производительности или затрачиваемых ресурсах, не будет. Есть некоторые тонкости при неявном конвертировании из подтипа в его базовый тип данных и наоборот, см. документацию по ссылке ниже.

В документации действительно не очень развернуто пояснено:

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
→ Ссылка
Автор решения: jashka34

Подтипы полезны тогда, когда вы создаёте большую программу и не уверены, что какой-то тип данных потом (в процессе разработки) не будет изменён.

Сделаете вы его скажем varchar2(10). Создадите 100 переменных в 50 пакетах. А потом решите, что теперь нужен varchar2(20). Менять все 100 переменных в 50 пакетах муторно и неудобно.

Поэтому, объявите тип subtype mytype varchar(10), и везде используйте его. И если нужно изменить на varchar2(20), то меняешь только в одном месте.

Тут вопрос: почему здесь используется ключевое слово subtype, а не type? Потому что нельзя написать type mytype varchar(10), будет ошибка, т.к. type используется для описания новых пользовтельских типов.

→ Ссылка