我尝试按如下方式创建父表和子表:
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_processlogid
,var_processname
,var_sourcelogid
和var_sourcename
。
我已为前两个var_processname = 'Process1'
和var_sourcename = 'Source1'
指定了值;我在perameter mapping section中分配了适当的变量。
我检查了所有限制。我一直无法解决问题。我做错了什么?
答案 0 :(得分:1)
你必须将一个错误的ProcessLogId
传递给GetSourceLogId
(BTW命名奇怪,这个程序主要插入一行,应该相应地命名)。由于您没有将电话发布到GetSourceLogId
,我无法告诉您哪里出错。
尝试删除FK_SourceLog_ProcessLog
constaint。然后你的插入应该成功。然后检查SourceLog
中的内容。毫无疑问,你会在ProcessLogId
找到ProcessLog
,Thread.stop().
。事情应该变得清晰。