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

时间:2015-11-04 09:16:48

标签: oracle stored-procedures ssis

我尝试按如下方式创建父表和子表:

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(,,输出???);结束;“因以下错误而失败:   “ORA-02291:完整性约束(PATIENTMDR.FK_SOURCELOG_PROCESSLOG)   违反 - 未找到父密钥ORA-06512:at   “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'指定了值;我在perameter mapping section中分配了适当的变量。

我检查了所有限制。我一直无法解决问题。我做错了什么?

1 个答案:

答案 0 :(得分:1)

你必须将一个错误的ProcessLogId传递给GetSourceLogId(BTW命名奇怪,这个程序主要插入一行,应该相应地命名)。由于您没有将电话发布到GetSourceLogId,我无法告诉您哪里出错。

尝试删除FK_SourceLog_ProcessLog constaint。然后你的插入应该成功。然后检查SourceLog中的内容。毫无疑问,你会在ProcessLogId找到ProcessLogThread.stop().。事情应该变得清晰。