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

问题描述 投票:0回答:1

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

oracle oracle-apex oracle-apex-5.1
1个回答
0
投票

一种选择是将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及更高版本),则可以使用identity列。不幸的是,您不能将表和现有ID列更改为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>

© www.soinside.com 2019 - 2024. All rights reserved.