ORA-01400: невозможно вставить NULL в («EnvironmentName». «Имя проекта». «ID») в ORACLE APEX - PullRequest
1 голос
/ 25 января 2020

Я создал приложение «из файла» (xls), и проект был создан успешно, я вижу строки. Исходная таблица не имеет идентификатора, который был добавлен автоматически при создании приложения в APEX. Я пытаюсь добавить новую строку, но это не дает мне текстовое поле для «ID», поэтому, когда я помещаю все данные, чтобы добавить новую строку, он жалуется на это сообщение. Как я могу сделать идентификатор для автоматического добавления? Или каким-либо другим способом прекратить получать эту ошибку?

1 Ответ

0 голосов
/ 25 января 2020

Один из вариантов - установить столбец идентификатора (в Apex) как «не требуется» и заполнить его в базе данных, используя триггер базы данных. Обычно это последовательность, которая делает это.

Сначала найдите текущее значение MAX идентификатора как

SQL> select * From test;

        ID ENAME
---------- ----------
      7369 SMITH
      7499 ALLEN
      7521 WARD
      7566 JONES
      7654 MARTIN

SQL> select max(id) from test;

   MAX(ID)
----------
      7654

Последовательность должна начинаться с 7655:

SQL> create sequence seq_test_id start with 7655;

Sequence created.

Триггер:

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

Trigger created.

Тестирование

SQL> insert into test (ename) values ('Littlefoot');

1 row created.

SQL> select * from test;

        ID ENAME
---------- ----------
      7369 SMITH
      7499 ALLEN
      7521 WARD
      7566 JONES
      7654 MARTIN
      7655 Littlefoot

6 rows selected.

SQL>

Поскольку он работает с SQL* Plus, он также будет работать с Apex.


Другой вариант - чтобы создать процесс в Apex, который будет делать:

:P1_ID := seq_test_id.nextval;

Или, если ваша версия базы данных достаточно высока (12 c и выше), вы можете использовать идентификатор столбец. К сожалению, вы не можете изменить таблицу и изменить существующий столбец идентификатора в столбце идентификатора. Если вы можете себе это позволить, создайте новый столбец для использования в качестве идентификатора.

SQL> alter table test add new_id number
  2    generated always as identity
  3    start with 7655;

Table altered.

К сожалению, вы не можете установить для него "старые" значения идентификатора:

SQL> update test set new_id = id;
update test set new_id = id
                *
ERROR at line 1:
ORA-32796: cannot update a generated always identity column

Итак, если с вами все в порядке:

SQL> select * From test;

        ID ENAME      NEW_ID
---------- ------ ----------
      7369 SMITH        7655
      7499 ALLEN        7656
      7521 WARD         7657
      7566 JONES        7658
      7654 MARTIN       7659

, тогда просто отбросьте столбец старого идентификатора и переименуйте новый столбец в его «старое» имя:

SQL> alter table test drop column id;

Table altered.

SQL> alter table test rename column new_id to id;

Table altered.

SQL> select * from test;

ENAME          ID
------ ----------
SMITH        7655
ALLEN        7656
WARD         7657
JONES        7658
MARTIN       7659

SQL>
...