我正在尝试使用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;
是否可以执行多个提交。我可以从这里的一些问题中看出不允许多次提交。有人能帮我解决这个问题吗
1条答案
按热度按时间rqqzpn5f1#
是否可以执行多个提交。
是的。但这通常是不好的做法,因为多个
COMMIT
会阻止您ROLLBACK
整个事务,因此您可能会遇到这样的情况:一半的业务逻辑已经执行并使用COMMIT
保存,然后第二部分失败,但您无法撤消前一半,因为它已经被COMMIT
执行,并且您的数据库最终处于意外状态。这并不意味着您不能(或不应该)使用多个
COMMIT
;如果您发现自己多次使用COMMIT
(或者在每个过程结束时),那么您应该退后一步,仔细检查您正在做的事情,并验证您的行为是否适当。这里我需要执行一个提交,这是没有发生,因为这我得到外键违规错误。
如果引用的数据插入到同一会话中并且未提交,则不会出现未找到外键的错误。只有在以下情况下才会出现外键未找到异常:
1.数据不存在;或
1.已插入到其他会话中,但尚未在该会话中提交(即使是同一用户)。
您确定没有插入错误的值吗?由于
TRANSLATIONS
的列名为TEXT_CONTENT_ID
,当您将该列的值插入TEXT_CONTENT
表时,它的值为'TextContent_' || v_TextContent_Id
而不是v_TextContent_Id
:这就引出了一个问题,为什么需要添加前缀
TextContent_
?如果这是一个常量值,那么它几乎没有任何好处,你可以在引用约束的两侧省略它,什么也不会改变(除了你的代码不会被“魔法”字符串所困扰,你不需要存储很大的字符串)。