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_processlogid
、var_processname
、var_sourcelogid
和 var_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
中的内容。毫无疑问,您会在那里找到ProcessLogId
s,它们在ProcessLog
中没有对应关系。那么事情应该就清楚了。
【讨论】:
如果我删除 FK_SourceLog_ProcessLog 约束,那么在 SourceLog 表中,ProcessLogId 将为空。 @user3607647 - 那么您没有传递从第一次调用中检索到的进程日志 ID。 在我的 SSIS 包中,我没有将输出方向分配给 ProcessLogId。它会导致问题。非常感谢!以上是关于ORA-02291: 完整性约束;找不到父键错误的主要内容,如果未能解决你的问题,请参考以下文章
ORA-02291: 违反完整性约束 (PRUEBA4.AUTO_MARCA_FK) - 未找到父键
ORA-02291: 违反完整约束条件 - 未找到父项关键字
ORA-02291: 违反完整性约束 (OPS$P2417335.VOD_FILM_CLASS_FK) - 未找到父密钥