Страницы

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

суббота, 14 декабря 2019 г.

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

#oracle #plsql


Можно каким-то образом завести псевдоним для встроенного типа с указанием максимальной
длины?

Чтобы я мог объявлять переменные не так

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: тип на уровне схемы имеет недопустимую ссылку на ...

    


Ответы

Ответ 1



Если я правильно понял из документации, то создавать подтипы для стандартные типов данных 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

Ответ 2



Можно где-то так: create or replace type number3 as object(value number(3)) final; / Type NUMBER3 compiled create or replace type mytype as object (short_id number3); / Type MYTYPE compiled select mytype(number3(999)).short_id.value as short_id from dual; SHORT_ID ---------- 999 select mytype(number3(9999)).short_id.value as short_id from dual; ORA-01438: value larger than specified precision allowed for this column Так как определён на уровне схемы, будет работать везде: declare short_id number3 := number3(999); begin dbms_output.put_line(short_id.value); end; / 999

Ответ 3



https://stackoverflow.com/a/7412149/5574962 Возможно, вы захотите использовать SUBTYPE. Разместите объявление подтипа в пакете и используйте его. CREATE OR REPLACE PACKAGE MYSUBTYPES_PKG IS SUBTYPE MYNUMBER IS NUMBER(3); END; Теперь можно, объявить переменную myvar mysubtypes_pkg.mynumber; Но атрибут в типе object всё равно не получится.

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

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