2015-11-04 8 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_processlogid, var_processname, var_sourcelogid и var_sourcename.

Я присвоил значения первым двум, var_processname = 'Process1' и var_sourcename = 'Source1'; и я назначил соответствующие переменные в разделе отображения параметров.

Я проверил все ограничения. Я не смог решить проблему. Что я делаю не так?

+0

Вы уверены, что (a) ваш звонок в GetSourceLogId передает идентификатор ПК, полученный при первом вызове; и (б) оба вызова происходят в одном сеансе БД) или первый вызов выполняется)? Показать код, который вызывает обе процедуры, может оказаться полезным. –

+0

Это будет работать, если вы вызываете первый «GetProcessLogId», записываете его вывод и повторно используете его в «GetSourceLogId' _per record_ в команде OLE DB в потоке данных. Вы не можете вызвать 'GetProcessLogId' для 100 записей и после этого вызова' GetSourceLogId'. Это то, что вы делаете? Это поможет, если вы объясните свой рабочий процесс SSIS. –

+0

У меня есть две задачи выполнения SQL. В первом я назвал первую процедуру, код: BEGIN GetProcessLogId (?,? Output); конец; У меня есть 4 переменные var_processlogid, var_processname, var_sourcelogid, var_sourcename. во второй задаче ExecuteSQL у меня есть код, как BEGIN GetSourceLogId (?,?,? output); конец; и сопоставил соответствующую переменную в разделе отображения параметров. – user3607647

ответ

1

Вы должны пройти плохую ProcessLogId до GetSourceLogId (что BTW названо странно, эта процедура в первую очередь вставляет строку и должна быть названа соответствующим образом). Поскольку вы не отправили , звоните в GetSourceLogId, я не могу сказать, где вы поступили не так.

Попробуйте удалить FK_SourceLog_ProcessLog constaint. Затем ваши вставки должны быть успешными. Затем проверьте, что у вас есть в SourceLog. Несомненно, вы найдете ProcessLogId, там нет корреспонденции в ProcessLog. Тогда все должно стать ясным.

+0

Если я удалю FK_SourceLog_ProcessLog constaint, то в таблице SourceLog ProcessLogId будет иметь значение null. – user3607647

+0

@ user3607647 - тогда вы не передаете идентификатор журнала процесса, полученный при первом вызове. –

+0

В моем пакете SSIS я не назначил направление вывода ProcessLogId. Это вызывает проблему. Спасибо огромное! – user3607647

Смежные вопросы