Страницы

Поиск по вопросам

суббота, 13 октября 2018 г.

Как завести псевдоним для типа number(3)?

Можно каким-то образом завести псевдоним для встроенного типа с указанием максимальной длины?
Чтобы я мог объявлять переменные не так
myvar number(3);
,а так
myvar mynumber;
А еще атрибуты в типе object, вот так
create or replace type myobject as object ( myattribute mynumber );
Я знаю один способ -- завести таблицу со столбцом нужного типа
create table mytable (mynumber number(3));
Теперь можно объявлять переменные
myvar mytable.mynumber%type;
Но это же фу, как некрасиво. Особенно, пустая таблица, болтающаяся в списке нормальных.
А также этот способ не подойдёт для объявления типа атрибутов в типе object. Компилятор выдаст ошибку
Ошибка: PLS-00329: тип на уровне схемы имеет недопустимую ссылку на ...


Ответ

Если я правильно понял из документации, то создавать подтипы для стандартные типов данных Oracle можно только на уровне PL\SQL, и использовать их только в PL\SQL. А типы объектов создаются только на уровне схемы и, следовательно, подтипы использовать не могут, только стандартные типы данных. Так что, видимо, только вариант с хаком через таблицу или другой объект остается, как написали выше.
Currently, you cannot define object types in a PL/SQL block, subprogram, or package.
Oracle Built-in Datatypes
Using PL/SQL With Object Types

@4per это к варианту @0xdb
CREATE OR REPLACE TYPE NUMBER3 AS OBJECT (value NUMBER(3)) FINAL;
CREATE TABLE TEST_T ( ID NUMBER3 //созданный тип );
INSERT INTO TEST_T (ID) VALUES (NUMBER3(333));
SQL1.sql: 1 Строка вставлена [0,001c]
INSERT INTO TEST_T (ID) VALUES (NUMBER3(3333));
ORA-01438: value larger than specified precision allowed for this column
т.е. такой вариант действительно работает

А по поводу "через другую таблицу" да, действительно не работает, извиняюсь.
CREATE TABLE TEMP_T ( ID NUMBER(3) );
CREATE TABLE TEMP_T2 (id TEMP_T.ID%TYPE);
ORA-00911: invalid character SQL.sql 7 14

Комментариев нет:

Отправить комментарий