Генерация уникального номера на основе записей - PullRequest
0 голосов
/ 27 августа 2018

У меня здесь ситуация.У меня есть таблица, которую я запрашиваю из своего приложения.У нас нет уникального идентификатора в этой таблице.

Мне просто нужно сгенерировать уникальный номер на основе содержимого записи, например, ORA_HASH.Я узнал, что ORA_HASH возвращает повторяемые значения.Поэтому я хочу знать, доступен ли какой-либо другой вариант.

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

Спасибо.

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Каждая таблица в базах данных oracle имеет псевдостолбец с именем ROWID, в котором хранится уникальный ключ для записи таблицы.Вы должны использовать этот ключ для своих целей:

SELECT ROWID, d.* FROM dual d 

В результате вы получите следующие данные:

ROWID                DUMMY
------------------   -------
AAAACOAABAAAAWBAAA   X
0 голосов
/ 27 августа 2018

Вы продолжаете упоминать "данные, которые повторяются" (это дубликаты , тогда?), И это является причиной отсутствия уникального идентификатора в таблице.

Если возможно (почему бы и нет?), Измените таблицу и добавьте новый столбец, назовем его «ID».Заполните его значение сейчас для существующих строк и создайте триггер базы данных, который позаботится о будущих вставках.

Вот пример:

SQL> create table test as select ename, job, sal from emp;

Table created.

SQL> alter table test add id number;

Table altered.

SQL> create sequence seq_id;

Sequence created.

SQL> update test set id = seq_id.nextval;

12 rows updated.

SQL> create or replace trigger trg_bi_test
  2    before insert on test
  3    for each row
  4  begin
  5    :new.id := nvl(:new.id, seq_id.nextval);
  6  end;
  7  /

Trigger created.

SQL> insert into test (ename, job, sal) values ('Littlefoot', 'loser', 100);

1 row created.

SQL> select * from test order by id;

ENAME      JOB              SAL         ID
---------- --------- ---------- ----------
SMITH      CLERK            800          1
ALLEN      SALESMAN        1600          2
WARD       SALESMAN        1250          3
JONES      MANAGER         2975          4
MARTIN     SALESMAN        1250          5
BLAKE      MANAGER         2850          6
CLARK      MANAGER         2450          7
KING       PRESIDENT       5000          8
TURNER     SALESMAN        1500          9
JAMES      CLERK            950         10
FORD       ANALYST         3000         11
MILLER     CLERK           1300         12
Littlefoot loser            100         13

13 rows selected.

SQL>

Теперь у вас есть «уникальный идентификатор», который фиксирован и не изменится при запросе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...