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_processlogid
、var_processname
、var_sourcelogid
和 var_sourcename
。
我已经为前两个赋值,var_processname = 'Process1'
和 var_sourcename = 'Source1'
;并且我在参数映射部分分配了适当的变量。
我已经检查了所有的约束条件。我一直无法解决问题。我做错了什么?
您必须将错误的 ProcessLogId
传递给 GetSourceLogId
(顺便说一句,这个名字很奇怪,这个过程主要是插入一行,应该相应地命名)。因为你没有 post 调用 给 GetSourceLogId
,我不知道你错在哪里。
尝试删除 FK_SourceLog_ProcessLog
约束。然后你的插入应该成功。然后检查 SourceLog
中的内容。毫无疑问,您会在那里找到 ProcessLogId
,它们在 ProcessLog
中没有对应关系。那么事情应该就清楚了。
我尝试创建 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_processlogid
、var_processname
、var_sourcelogid
和 var_sourcename
。
我已经为前两个赋值,var_processname = 'Process1'
和 var_sourcename = 'Source1'
;并且我在参数映射部分分配了适当的变量。
我已经检查了所有的约束条件。我一直无法解决问题。我做错了什么?
您必须将错误的 ProcessLogId
传递给 GetSourceLogId
(顺便说一句,这个名字很奇怪,这个过程主要是插入一行,应该相应地命名)。因为你没有 post 调用 给 GetSourceLogId
,我不知道你错在哪里。
尝试删除 FK_SourceLog_ProcessLog
约束。然后你的插入应该成功。然后检查 SourceLog
中的内容。毫无疑问,您会在那里找到 ProcessLogId
,它们在 ProcessLog
中没有对应关系。那么事情应该就清楚了。