我试图创建父和子表如下: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