【问题标题】:Insert values two dependent tables Oracle Apex在两个从属表 Oracle Apex 中插入值
【发布时间】:2019-11-25 17:38:06
【问题描述】:

我从 3 个依赖表中创建了一个查询:

  1. 汽车零件(id, name, value);

  2. car_model(id, name,price);

  3. part_and_model(car_model_id, car_part_id)

我从值列表中获取我的汽车模型,对于 car_id,我使用序列作为增量。

我的查询中有所有需要的字段,但现在我想同时将数据插入 car_parts 和 part_and_model。我在提交插入时创建了两个进程(第一个用于 car_parts(fk),第二个用于 part_and_model)。当我运行它时,我得到了这个错误并且没有数据被插入到表中:

ORA-02291:违反完整性约束 (PRACTICE.FK_CAR_PART_car_part) - 未找到父密钥

当我删除第二个进程时,数据被正确插入到 car_parts 表中。为什么会这样?第二个过程在第一个之前执行吗?我还缺少什么?

项目 P8_CAR_MODEL = LOV; item P8_ID=>sequence: SELECT CP_SEK.NEXTVAL FROM DUAL;

进程1:插入CAR_PARTS(CP_ID,CP_NAME,CP_PRICE) VALUES (:P8_ID, :P8_NAME, :P8_PRICE);

process2: 插入part_and_model(PART_ID, MODEL_ID) 值(:P8_ID,:P8_CAR_MODEL);

编辑:

我设法插入到 car_parts 表中,但错误仍然说找不到父级(即使)它在表中,所以它必须是序列...... 这是我的代码: 过程1: 开始 选择 PART_SEK.NEXTVAL INTO :P8_ID from dual;

插入 car_parts(id,name,value) VALUES (:P8_ID, :P8_NAME, :P8_PRICE); 结束;

进程2:

插入part_and_model(car_model_id, car_part_id) 值(:P8_MODEL,:P8_ID);

编辑2: 当我在第二个过程中使用 PART_SEK.currval 而不是 p8_id 时,它可以工作 再次感谢大家的宝贵时间。

【问题讨论】:

  • 正如 littlefoot 所说,在一个进程中完成两个插入。但我想补充一条评论。如果您真的不需要在插入之前查看项目 P8_ID(您很可能不需要),您应该在插入之前的过程中声明它并为其分配其值。因为如果它是项目的来源,那么每次加载时,都会触发序列。因此,您的数据库将在 CP_ID 中出现间隙(值会像 1、3、4、8、13,..)这并没有真正破坏任何东西,如果它们是完全连续的,那就更好了。

标签: sql oracle oracle-apex


【解决方案1】:

在同一进程中向两个表中插入行;首先是主表,然后是详细信息。

【讨论】:

  • @marcus 有什么限制 PRACTICE.FK_CAR_PART_car_part
  • 在表part和model中,我有两个外键,car part id(引用car parts id)和model id(引用model表中的一个)
【解决方案2】:

查看流程的顺序。第一个进程必须具有较低的序列,例如 10,而第二个进程必须更大。 确保您在第一个过程中必须插入到主表中。 将流程执行点更改为处理。

【讨论】:

  • 第一个进程具有较低的序列 (10),第二个是 20。我还添加了代码以将 seq.nextval 获取到第一个进程中的页面项目。插入汽车零件现在已成功,但在执行第二个过程时仍然显示没有外键(刚刚插入的那个)。感谢大家的宝贵时间。
【解决方案3】:
DECLARE
  a_id NUMBER;
BEGIN
  a_id := your_sequence.nextval;

  INSERT INTO car_parts (cp_id, cp_name, cp_price)
  VALUES (a_id, :P8_NAME, :P8_PRICE);

  INSERT INTO part_and_model (part_id, model_id)
  VALUES (a_id, :P8_CAR_MODEL);
END;

按照所有权利,这应该有效。我确实相信您的问题确实与序列有关,我想不出还有什么会导致您的错误。所以请试试这个并告诉我们。

【讨论】:

  • 感谢您的努力,不幸的是,它没有奏效。我设法插入到 car_parts 表中,但错误仍然说找不到父级(即使)它在表中,所以它必须是序列......这是我的代码: process1: begin select PART_SEK.NEXTVAL INTO :P8_ID 来自双重;插入 car_parts(id,name,value) VALUES (:P8_ID, :P8_NAME, :P8_PRICE);结尾; process2: 插入part_and_model(car_model_id, car_part_id) 值(:P8_MODEL,:P4_ID_PRICE);
  • @marcus 现在是一些新代码,第二个插入需要:P4_ID_PRICE??您是否尝试过我编写的仅更改必要的变量名的过程?如果仍然无效,请进入对象浏览器并找到先前输入的汽车部件的 id 并将其作为静态值插入,以便我们查看您的外键是否搞砸了。
  • p4_id_price 是我的错误,当我复制时。我使用序列currval,它现在可以工作了,非常感谢。
猜你喜欢
  • 2017-10-23
  • 2020-09-16
  • 2016-06-11
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 2016-07-07
相关资源
最近更新 更多