2015-11-04 141 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

相關問題