Можно каким-то образом завести псевдоним для встроенного типа с указанием максимальной длины?
Чтобы я мог объявлять переменные не так
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
Комментариев нет:
Отправить комментарий