ORA-02291: 完整性约束;找不到父键错误

Posted

技术标签:

【中文标题】ORA-02291: 完整性约束;找不到父键错误【英文标题】:ORA-02291: integrity constraint ; parent key not found error 【发布时间】:2015-11-04 09:16:47 【问题描述】:

我尝试创建父子表如下:

CREATE SEQUENCE ProcessLogId;

CREATE TABLE ProcessLog
(
ProcessLogId NUMBER DEFAULT ProcessLogId.NEXTVAL NOT NULL ,
ProcessName VARCHAR(20),
ProcessStatus VARCHAR(20),
StartTime DATE ,
EndTime DATE,
CreatedOn DATE DEFAULT (SYSDATE) NOT NULL,
CreatedBy VARCHAR(45) DEFAULT USER NOT NULL,
CONSTRAINT PK_ProcessLog PRIMARY KEY(ProcessLogId)
);

CREATE SEQUENCE SourceLogId;

CREATE TABLE SourceLog
(
SourceLogId    NUMBER DEFAULT SourceLogId.NEXTVAL NOT NULL ,
ProcessLogId    NUMBER NULL,
SourceName    VARCHAR(512) NOT NULL,
TotalRowCount    INT,
Status    VARCHAR(20),
StartTime    DATE,
EndTime    DATE
CONSTRAINT PK_SourceLogId PRIMARY KEY(SourceLogId),
CONSTRAINT CK_SourceLog_Status CHECK (Status='S' OR Status='F' OR Status='I'),
CONSTRAINT FK_SourceLog_ProcessLog FOREIGN KEY (ProcessLogId) REFERENCES ProcessLog(ProcessLogId)
);

我已经创建了两个插入记录的过程:

CREATE OR REPLACE PROCEDURE GetProcessLogId
(
ProcessName IN VARCHAR,ProcessLogId OUT INT)
AS
BEGIN
    INSERT INTO PROCESSLOG
           (ProcessName
           ,ProcessStatus
           ,StartTime)               

    VALUES(ProcessName
           ,'I'
           ,SYSDATE)
    RETURNING ProcessLogId INTO ProcessLogId;

END;

CREATE OR REPLACE PROCEDURE GetSourceLogId
(ProcessLogId IN NUMBER,SourceName IN VARCHAR,SourceLogId OUT NUMBER)
AS
BEGIN   

    INSERT INTO SourceLog
            (ProcessLogId
            ,SourceName
            ,Status
            ,StartTime)        
    VALUES  (ProcessLogId
            ,SourceName
            ,'I'
            ,SYSDATE)
    RETURNING SourceLogId INTO SourceLogId;
END; 

我创建了 SSIS 包来调用这两个过程。父 ProcessLog 记录已成功插入。但是对于子表过程,我收到以下错误:

"[执行 SQL 任务] 错误:执行查询"BEGIN GetSourceLogId(?,?,?output); end;" 失败并出现以下错误: "ORA-02291: 完整性约束 (PATIENTMDR.FK_SOURCELOG_PROCESSLOG) 违反 - 未找到父键 ORA-06512: 在 “PATIENTMDR.GETSOURCELOGID”,第 6 行 ORA-06512:第 1 行“。可能 失败原因:查询有问题,“ResultSet”属性未设置 正确,参数设置不正确,或连接未建立 正确。”

我的 SSIS 包包含两个 ExecuteSQL 任务。在第一个任务中,我调用了GetProcessLogId 过程:

BEGIN
GetProcessLogId(?,?output);
end;

在第二个任务中我调用了GetSourceLogId 过程:

BEGIN
GetSourceLogId(?,?,?output);
end;

我有四个变量,var_processlogidvar_processnamevar_sourcelogidvar_sourcename

我已经为前两个赋值,var_processname = 'Process1'var_sourcename = 'Source1';我已经在参数映射部分分配了适当的变量。

我已经检查了所有的约束。我一直无法解决问题。我做错了什么?

【问题讨论】:

您确定 (a) 您对 GetSourceLogId 的调用正在传递从第一次调用中获得的 PK ID;和(b)两个调用都发生在同一个数据库会话中)或第一个调用正在提交)?显示调用这两个过程的代码可能会有所帮助。 只有当您首先调用 GetProcessLogId,捕获其输出并在数据流中的 OLE DB 命令中的 GetSourceLogId 每条记录 中重用它时,这才会起作用.您不能为 100 条记录调用 GetProcessLogId,然后再调用 GetSourceLogId。那是你在做什么?如果您解释一下您的 SSIS 工作流程,将会有所帮助。 我有两个执行 SQL 任务。在第一个我调用了第一个过程中,代码是: BEGIN GetProcessLogId(?,?output);结尾;我有 4 个变量 var_processlogid、var_processname、var_sourcelogid、var_sourcename。在第二个 ExecuteSQL 任务中,我有类似 BEGIN GetSourceLogId(?,?,?output); 的代码结尾;并在参数映射部分映射适当的变量。 请添加代码和重要的新信息作为对问题的编辑,而不是作为评论。我对 SSIS 不熟悉,任务是否在单独的 Oracle 会话中? 错误消息显示没有值传递给 GetSourceLogId 过程。你能显示调用这两个过程的主要过程吗?或者您可以在调用 GetSourceLogId 过程之前测试打印参数。 【参考方案1】:

您必须将错误的ProcessLogId 传递给GetSourceLogId(顺便说一句,奇怪的是,此过程主要插入一行并应相应命名)。由于您没有向GetSourceLogId 发布电话,我无法判断您哪里出错了。

尝试删除FK_SourceLog_ProcessLog 约束。然后你的插入应该成功。然后检查SourceLog 中的内容。毫无疑问,您会在那里找到ProcessLogIds,它们在ProcessLog 中没有对应关系。那么事情应该就清楚了。

【讨论】:

如果我删除 FK_SourceLog_ProcessLog 约束,那么在 SourceLog 表中,ProcessLogId 将为空。 @user3607647 - 那么您没有传递从第一次调用中检索到的进程日志 ID。 在我的 SSIS 包中,我没有将输出方向分配给 ProcessLogId。它会导致问题。非常感谢!

以上是关于ORA-02291: 完整性约束;找不到父键错误的主要内容,如果未能解决你的问题,请参考以下文章

ORA-02291: 违反完整性约束 (PRUEBA4.AUTO_MARCA_FK) - 未找到父键

ORA-02291: 当我尝试添加数据时出现完整性约束错误

ORA-02291: 违反完整约束条件 - 未找到父项关键字

找不到父键,我不知道为啥

ORA-02291: 违反完整性约束 (OPS$P2417335.VOD_FILM_CLASS_FK) - 未找到父密钥

ORA-02291: 违反完整约束条件 (*) - 未找到父项关键字