Я попытался создать родительские и дочерние таблицы следующим образом: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 передает идентификатор ПК, полученный при первом вызове; и (б) оба вызова происходят в одном сеансе БД) или первый вызов выполняется)? Показать код, который вызывает обе процедуры, может оказаться полезным. –
Это будет работать, если вы вызываете первый «GetProcessLogId», записываете его вывод и повторно используете его в «GetSourceLogId' _per record_ в команде OLE DB в потоке данных. Вы не можете вызвать 'GetProcessLogId' для 100 записей и после этого вызова' GetSourceLogId'. Это то, что вы делаете? Это поможет, если вы объясните свой рабочий процесс SSIS. –
У меня есть две задачи выполнения SQL. В первом я назвал первую процедуру, код: BEGIN GetProcessLogId (?,? Output); конец; У меня есть 4 переменные var_processlogid, var_processname, var_sourcelogid, var_sourcename. во второй задаче ExecuteSQL у меня есть код, как BEGIN GetSourceLogId (?,?,? output); конец; и сопоставил соответствующую переменную в разделе отображения параметров. – user3607647