2015-11-04 25 views
0

我试图创建父和子表如下:ORA-02291:完整性约束;父项未找到错误

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记录正在成功插入。但对于子表程序,我收到以下错误:

"[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';并且我已经在参数映射部分中分配了适当的变量。

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

+0

您确定(a)您对GetSourceLogId的调用正在传递从第一次调用中获得的PK ID;和(b)两个调用都发生在同一个DB会话中)或第一个调用正在提交)?显示调用这两个过程的代码可能会有帮助。 –

+0

如果您首先调用'GetProcessLogId',捕获其输出并在数据流中的OLE DB命令的'GetSourceLogId' _per record_中重用它,这只会起作用。您无法为100条记录调用'GetProcessLogId',然后调用'GetSourceLogId'。那是你在做什么?如果你解释了你的SSIS工作流程,这将有所帮助。 –

+0

我有两个执行SQL任务。在第一个我称为第一个过程中,代码是:BEGIN GetProcessLogId(?,?output); 结束;我有4个变量var_processlogid,var_processname,var_sourcelogid,var_sourcename。在第二个ExecuteSQL任务中,我有类似BEGIN GetSourceLogId(?,?,?output)的代码; 结束;并在参数映射部分中映射适当的变量。 – user3607647

回答

1

您必须通过一个错误的ProcessLogIdGetSourceLogId(这是BTW命名奇怪,此过程主要插入一行并应相应命名)。由于您没有发帖致电GetSourceLogId,我无法分辨您出错的地方。

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

+0

如果我删除FK_SourceLog_ProcessLog constaint,那么在SourceLog表中,ProcessLogId将为空。 – user3607647

+0

@ user3607647 - 那么你没有传递从第一次调用中检索到的进程日志ID。 –

+0

在我的SSIS包中,我没有将输出方向分配给ProcessLogId。它导致了这个问题。非常感谢! – user3607647

相关问题