Witam!
Napisałem następującą procedurę w PL/SQL:
CREATE DEFINER=`root`@`localhost` PROCEDURE `P_DEL_LANGUAGE`(lang int(10))
BEGIN
DECLARE WORDID INT;
DECLARE v_max int unsigned;
DECLARE v_counter int unsigned default 0;
DECLARE wordsTranslationToDel int unsigned;
SET SQL_SAFE_UPDATES=0;
SET v_max = (SELECT count(*) FROM words WHERE languageId = lang);
WHILE v_counter <= v_max DO
SELECT idWord INTO WORDID FROM words
WHERE languageId = lang LIMIT 1;
SELECT idTranslation INTO wordsTranslationToDel FROM wordsTranslations
WHERE (wordLang1 = WORDID) OR (wordLang2 = WORDID);
IF (WORDID IS NOT NULL) THEN
DELETE FROM groupContent
WHERE wordTranslation = wordsTranslationToDel;
DELETE FROM wordsTranslations
WHERE (wordLang1 = WORDID) OR (wordLang2 = WORDID);
DELETE FROM words WHERE idWord = WORDID;
END IF;
SET v_counter=v_counter+1;
END WHILE;
DELETE FROM languages WHERE idLanguage = lang;
END$$
Jej działanie sprawdzam np. tak:
CALL P_DEL_LANGUAGE(2);
SELECT * FROM languages;
Wszystko działa jak trzeba, kasuje to co chcę. Jednak gdy to samo chcę sprawdzić wywołując procedurę z poziomu JAVY, tabela ‘languages’ pozostaje niezmieniona. Próbowałem na kilka sposobów, ostatni z nich:
@Override
public boolean deleteLanguage(int langId) {
connect = SqlDAOFactory.createConnection();
try {
System.out.println("id Lang: " + langId);
connect.setAutoCommit(false);
cs = connect.prepareCall("{CALL P_DEL_LANGUAGE(?)}");
cs.setInt(1, langId);
cs.executeUpdate();
System.out.println("Deleted...");
return true;
} catch (SQLException e) {
e.printStackTrace();
if (connect != null) {
try {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JOptionPane.showMessageDialog(null, "Transaction is being rolled back");
}
});
connect.rollback();
} catch (SQLException excep) {
e.printStackTrace();
}
}
return false;
} finally {
try {
if (cs != null) {
cs.close();
}
if (statement != null) {
statement.close();
}
if (connect != null) {
connect.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Po wykonaniu nie ma żadnych wyjątków, pojawia się napis “Deleted…”, ale w bazie danych nic się nie zmienia. Dodatkowo napiszę, że identyczna sytuacja jest jeśli procedurę zamienię na funkcję i wywołam w MySQL Workbench:
SELECT F_DEL_LANGUAGE(5);
. W tym przypadku stosuje poniższy kod JAVY:
query = "SELECT F_DEL_LANGUAGE(" + langId + ");";
statement = connect.createStatement();
result = statement.executeQuery(query);
while (result.next()) {
System.out.println(result.getInt(1));
}
System.out.println("Deleted...");
Co ciekawe, funkcja zwraca poprawnie wartość (czyli się wykonuje), dlatego nie rozumiem, czemu nie kasuje wpisów z bazy, tak jak bezpośrednio uruchomiona w MySQL Workbench.