Я пытаюсь вставить кортеж из входного отношения INPUTRel в исходное отношение UK_RD_Spend с внешним ключом, а затем обновить кортеж целевого отношения UK_Status. UK_Status и UK_RD_Spend имеют отношение первичный ключ-внешний ключ.
Вот параметры: INPUTRel: TransId, Company, ICB_Code, RD2008 UK_RD_Spend: Company, ICB_Code, RD_spend_2008 UK_Status: Company: RD08
Итак, я вставляю кортеж из INPUTRel в UK_RD_Spend. Это удалось. Но когда я пытаюсь обновить кортеж UK_Status, он вернул SQLException.
Я пытаюсь обновить RD08, но мне также нужно проверить, не нарушается ли ограничение внешнего ключа (если название компании не существует в UK_RD_Spend). Однако я получаю следующие ошибки:
SQLException: UCAExc:::4.0.3 user lacks privilege or object not found:
Я не знаю, как это исправить. Часть моего кода выглядит следующим образом:
String queryFK = "SELECT * FROM UK_Status WHERE Company = "
+ company + "";
pstmt = conn.prepareStatement(queryFK);
pstmt.setString(1, company);
pstmt.setDouble(2, RD2008);
String msg1;
try {
pstmt.executeUpdate();
} catch (SQLException se) {
// Check FK Violation: company must exist
if (t2.get(company).getCompany() == null) {
// or this ?->
// if
// (!(conn.createStatement()).executeQuery(queryFK).next())
// {
String ICB_CodeTest = Integer.toString(ICB_Code);
String RD2008Test = Double.toString(RD2008);
ICB_CodeTest = ICB_CodeTest.replaceAll("\\s+", "");
RD2008Test = RD2008Test.replaceAll("\\s+", "");
msg1 = "Transaction "
+ tid
+ " failed due to a FK constraint, for the following values of the input; ("
+ company + ", " + ICB_Code + ", " + RD2008
+ ")";
String fk2 = "INSERT INTO OUTPUTRel"
+ "(TransId, RunMessages) " + "values (?, ?)";
pstmt = conn.prepareStatement(fk2);
pstmt.setInt(1, tid);
pstmt.setString(2, msg1);
pstmt.execute();
pstmt.close();
continue;
}
}
//
String companyName = t2.get(company).getCompany();
Status s = t2.get(companyName);
s.setRD2008(RD2008);
String query = "UPDATE UK_Status SET RD08 = ? WHERE Company = ?";
pstmt = conn.prepareStatement(query);
pstmt.setDouble(1, s.getRD2008());
pstmt.setString(2, company);
int number = (int) s.getRD2008();
if (number < ICB_Code) {
msg = "Transaction "
+ tid
+ " succeeded for the following values of the input; ("
+ company + ", " + ICB_Code + ", " + RD2008 + ")";
pstmt.execute();
// Finally insert execution result on the output table.
String oo = "INSERT INTO OUTPUTRel"
+ "(TransId, RunMessages) " + "values (?, ?)";
pstmt = conn.prepareStatement(oo);
pstmt.setInt(1, tid);
pstmt.setString(2, msg);
pstmt.execute();
pstmt.close();
} else {
msg = "Transaction "
+ tid
+ " failed due to a dynamic constraint, for the following values of the input; ("
+ company + ", " + ICB_Code + ", " + RD2008 + ")";
// Finally insert execution result on the output table.
String dynamicFail = "INSERT INTO OUTPUTRel"
+ "(TransId, RunMessages) " + "values (?, ?)";
pstmt = conn.prepareStatement(dynamicFail);
pstmt.setInt(1, tid);
pstmt.setString(2, msg);
pstmt.execute();
pstmt.close();
}
}