ORA-02291: 完整性约束; parent 找不到密钥错误

ORA-02291: integrity constraint ; parent key not found error

我尝试创建 parent 和 child table 如下:

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 包来调用这两个过程。 Parent ProcessLog 条记录已成功插入。但是对于 child table 程序,我收到以下错误:

"[Execute SQL Task] Error: Executing the query "BEGIN GetSourceLogId(?,?,?output); end;" failed with the following error: "ORA-02291: integrity constraint (PATIENTMDR.FK_SOURCELOG_PROCESSLOG) violated - parent key not found ORA-06512: at "PATIENTMDR.GETSOURCELOGID", line 6 ORA-06512: at line 1". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly."

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

BEGIN
GetProcessLogId(?,?output);
end;

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

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

我有四个变量,var_processlogidvar_processnamevar_sourcelogidvar_sourcename

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

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

您必须将错误的 ProcessLogId 传递给 GetSourceLogId(顺便说一句,这个名字很奇怪,这个过程主要是插入一行,应该相应地命名)。因为你没有 post 调用 GetSourceLogId,我不知道你错在哪里。

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