ORA-01400:无法将NULL插入ORACLE APEX中的(“ EnvironmentName”。“ Project name”。“ ID”)

我“从文件”(xls)创建了一个应用程序,并且该项目创建成功,可以看到这些行。原始表显然没有在APEX上创建应用程序时自动添加的“ ID”。我正在尝试添加新行,但是没有给我“ ID”的文本字段,因此当我将所有数据添加到新行中时,它会显示此消息。如何使ID自动添加?还是有其他方法可以停止收到此错误?

bluelanyuying 回答:ORA-01400:无法将NULL插入ORACLE APEX中的(“ EnvironmentName”。“ Project name”。“ ID”)

一种选择是将ID列(在Apex中)设置为“不需要”,并使用数据库触发器将其填充到数据库中。通常,这是执行此操作的顺序。

首先,找到ID的当前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;

或者,如果您的数据库版本足够高(12c和更高),则可以使用身份列。不幸的是,您不能将表更改,也不能将现有的ID列 modify 更改为identity列。如果可以承受,请创建一个新列以用作ID。

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

Table altered.

很遗憾,您不能将其设置为“旧” ID值:

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

然后只需删除旧的ID列并将新列重命名为其“旧”名称:

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>
本文链接:https://www.f2er.com/2715177.html

大家都在问