oracle 使用dblink完整性约束违反错误

fumotvh3  于 2023-06-29  发布在  Oracle
关注(0)|答案(1)|浏览(125)

我正在尝试使用dblink将数据从远程数据库插入到表中。第一次插入text_content表没有发生/提交没有发生,然后我试图插入到翻译表。

declare
  v_TextContent_Id NUMBER(19);
begin
    SELECT TEXT_CONTENT_SEQ.NEXTVAL@DBLINK1
    INTO v_TextContent_Id FROM DUAL;  
    --
     INSERT INTO TEXT_CONTENT@DBLINK1 (ID,TEXT_CONTENT_ID)
     VALUES(v_TextContent_Id,CONCAT(u'TextContent_',v_TextContent_Id));  
    dbms_output.put_line('v_TextContent_Id = ' || v_TextContent_Id);
     
  ----- here i need to perform a commit and this is not happening because of this  i get foreign key violation error. 

    INSERT INTO TRANSLATIONS@DBLINK1 (TEXT_CONTENT_ID,LANGUAGE_ID,TRANSLATION)
    VALUES(v_TextContent_Id,1,u'MobileAppD');
end;

是否可以执行多个提交。我可以从这里的一些问题中看出不允许多次提交。有人能帮我解决这个问题吗

rqqzpn5f

rqqzpn5f1#

是否可以执行多个提交。
是的。但这通常是不好的做法,因为多个COMMIT会阻止您ROLLBACK整个事务,因此您可能会遇到这样的情况:一半的业务逻辑已经执行并使用COMMIT保存,然后第二部分失败,但您无法撤消前一半,因为它已经被COMMIT执行,并且您的数据库最终处于意外状态。
这并不意味着您不能(或不应该)使用多个COMMIT;如果您发现自己多次使用COMMIT(或者在每个过程结束时),那么您应该退后一步,仔细检查您正在做的事情,并验证您的行为是否适当。
这里我需要执行一个提交,这是没有发生,因为这我得到外键违规错误。
如果引用的数据插入到同一会话中并且未提交,则不会出现未找到外键的错误。只有在以下情况下才会出现外键未找到异常:
1.数据不存在;或
1.已插入到其他会话中,但尚未在该会话中提交(即使是同一用户)。
您确定没有插入错误的值吗?由于TRANSLATIONS的列名为TEXT_CONTENT_ID,当您将该列的值插入TEXT_CONTENT表时,它的值为'TextContent_' || v_TextContent_Id而不是v_TextContent_Id

declare
  v_TextContent_Id NUMBER(19);
begin
  SELECT TEXT_CONTENT_SEQ.NEXTVAL@DBLINK1
  INTO   v_TextContent_Id
  FROM   DUAL;  

  INSERT INTO TEXT_CONTENT@DBLINK1 (ID,TEXT_CONTENT_ID)
  VALUES(v_TextContent_Id, u'TextContent_' || v_TextContent_Id);  

  dbms_output.put_line('v_TextContent_Id = ' || v_TextContent_Id);
     
  INSERT INTO TRANSLATIONS@DBLINK1 (
    TEXT_CONTENT_ID,
    LANGUAGE_ID,
    TRANSLATION
  ) VALUES (
    u'TextContent_' || v_TextContent_Id,          -- ensure the correct prefix.
    1,
    u'MobileAppD'
  );
end;
/

这就引出了一个问题,为什么需要添加前缀TextContent_?如果这是一个常量值,那么它几乎没有任何好处,你可以在引用约束的两侧省略它,什么也不会改变(除了你的代码不会被“魔法”字符串所困扰,你不需要存储很大的字符串)。

相关问题