запись содержащая только уникальные значения.

AlexGru
Дата: 06.11.2008 18:44:46
День добрый.

Можно ли описать тип записи задав ограничение на уникальность?

Например

TYPE TYPE_RECORD_PHONES IS RECORD (PHONE_NUM VARCHAR(30) [UNIQUE ?????]);

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

Что-то не могу найти?

Спасибо.
SY
Дата: 06.11.2008 19:12:46
You can not create nested table "на уровне базы" using PL/SQL RECORD type. You need to create database type:

SQL> CREATE OR REPLACE
  2    TYPE PHONE_LIST_TBL_TYPE AS TABLE OF VARCHAR(30);
  3  /

Type created.

SQL> CREATE TABLE PERSON(
  2                      ID         NUMBER,
  3                      NAME       VARCHAR2(10),
  4                      PHONE_LIST PHONE_LIST_TBL_TYPE
  5                     )
  6    NESTED TABLE PHONE_LIST STORE AS PHONE_LIST_TBL
  7  /

Table created.

SQL> ALTER TABLE PHONE_LIST_TBL
  2    ADD CONSTRAINT PHONE_LIST_TBL_PK
  3      PRIMARY KEY(COLUMN_VALUE)
  4  /

Table altered.

SQL> INSERT
  2    INTO PERSON
  3    VALUES(
  4           1,
  5           'AlexGru',
  6           PHONE_LIST_TBL_TYPE('Phone1','Phone1')
  7          )
  8  /
INSERT
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.PHONE_LIST_TBL_PK) violated


SQL> INSERT
  2    INTO PERSON
  3    VALUES(
  4           1,
  5           'AlexGru',
  6           PHONE_LIST_TBL_TYPE('Phone1','Phone2')
  7          )
  8  /

1 row created.

SQL> 

SY.
AlexGru
Дата: 06.11.2008 19:28:52
Thanks so much, I had tested it on my base. Work nice.
But, what about clear PL/SQL???
expla
Дата: 06.11.2008 19:39:57
AlexGru,
в PL/SQL уникальность записей в коллекции придётся проверять своими процедурами или отложить это дело до сохренения записей в БД, тогда СУБД проверит уникальность в соответствии с декларативными ограничениями целостности. Встроенных проверятелей уникальности в PL/SQL нет.
AlexGru
Дата: 06.11.2008 19:46:17
expla

в PL/SQL уникальность записей в коллекции придётся проверять своими процедурами или отложить это дело до сохренения записей в БД, тогда СУБД проверит уникальность в соответствии с декларативными ограничениями целостности. Встроенных проверятелей уникальности в PL/SQL нет.


А что если я работаю только в PL/SQL и сохранять ничего в базу не буду?
Что только свои методы писать для проверки уникальности?

Может каждую новую запись добавлять к вложеной таблице через MULTISET UNION DISTINCT,...
хотя это уже пользовательские методы.

Хорошо. Спасибо. Буду знать.
SY
Дата: 06.11.2008 21:05:02
AlexGru
But, what about clear PL/SQL???


You could use associative arrays:

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  2      TYPE PHONE_LIST_TBL_TYPE
  3       IS
  4         TABLE OF VARCHAR(30)
  5         INDEX BY VARCHAR2(30);
  6      PHONES PHONE_LIST_TBL_TYPE;
  7  BEGIN
  8      IF PHONES.EXISTS('Phone1')
  9        THEN
 10          DBMS_OUTPUT.PUT_LINE('Duplicate phone.');
 11        ELSE
 12          PHONES('Phone1') := 'Phone1';
 13      END IF;
 14      IF PHONES.EXISTS('Phone2')
 15        THEN
 16          DBMS_OUTPUT.PUT_LINE('Duplicate phone.');
 17        ELSE
 18          PHONES('Phone2') := 'Phone2';
 19      END IF;
 20      IF PHONES.EXISTS('Phone1')
 21        THEN
 22          DBMS_OUTPUT.PUT_LINE('Duplicate phone.');
 23        ELSE
 24          PHONES('Phone1') := 'Phone1';
 25      END IF;
 26  END;
 27  /
Duplicate phone.

PL/SQL procedure successfully completed.

SQL> 

SY.
AlexGru
Дата: 07.11.2008 10:42:17
Спасибо.