Java, MySQL problem z wywołaniem procedury


(Maciek Stepniak) #1

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.


(kostek135) #2

Prawdopodobnie brakuje commit-a. Poczytaj o tym co to są transakcje i do czego służą.


(Maciek Stepniak) #3

Problem rozwiązano, faktycznie brakowało COMMIT'a. Dzięki za odzew!