我試圖創建父和子表如下: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_processlogid
,var_processname
,var_sourcelogid
和var_sourcename
。
我已將前兩個值分配給var_processname = 'Process1'
和var_sourcename = 'Source1'
;並且我已經在參數映射部分中分配了適當的變量。
我檢查了所有的約束條件。我一直無法解決問題。我究竟做錯了什麼?
您確定(a)您對GetSourceLogId的調用正在傳遞從第一次調用中獲得的PK ID;和(b)兩個調用都發生在同一個DB會話中)或第一個調用正在提交)?顯示調用這兩個過程的代碼可能會有幫助。 –
如果您首先調用'GetProcessLogId',捕獲其輸出並在數據流中的OLE DB命令的'GetSourceLogId' _per record_中重用它,這隻會起作用。您無法爲100條記錄調用'GetProcessLogId',然後調用'GetSourceLogId'。那是你在做什麼?如果你解釋了你的SSIS工作流程,這將有所幫助。 –
我有兩個執行SQL任務。在第一個我稱爲第一個過程中,代碼是:BEGIN GetProcessLogId(?,?output); 結束;我有4個變量var_processlogid,var_processname,var_sourcelogid,var_sourcename。在第二個ExecuteSQL任務中,我有類似BEGIN GetSourceLogId(?,?,?output)的代碼; 結束;並在參數映射部分中映射適當的變量。 – user3607647