Usuwanie wielu wierszy razem z powiązaniami

Usuwanie wielu wierszy razem z powiązaniami
Dev007
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 163
0

Napisałem skrypt, który usuwa rekordy w tabeli która posiada relację do innych tabel (usuwam powiązanie). Początkowo puściłem to dla jednego usera w warunku i zadziałało, ale jak chce odpalić to dla całość aby skasowało mi kilkaset rekordów to mija 40 min i skrypt cały czas chodzi.

Czy mogę jakoś sprawdzić w czym jest problem może jakieś zakleszczenie się pojawiło ?

Kopiuj
DECLARE
BEGIN
		FOR c IN (
	SELECT up.USER_ID, ura.oid
	FROM 13279_PP pp
	JOIN CUSTOMER_PROFILE cp ON
		cp.CUST_ID = pp.CUST_ID
	JOIN USER_PROFILE up ON
		up.CUST_PROFILE_ID = cp.CUST_PROFILE_ID
	JOIN USER_ROLE_ASSIGNMENT ura ON
		ura.USER_ID = up.USER_ID
		AND URA.ROLE_ID != '43'
	) LOOP 
		DELETE
	FROM ROLE_ASSIGNMENT
	WHERE oid = c.oid;
END
LOOP;
END;
ledi12
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
1

Zastanawia mnie po co tam pętlę ładujesz. Nie używam Oracla, ale wygląda jak by nadal korzystał z zasobów, które zostały usunięte. Podobne zachowanie jak w przypadku usuwaniu elementów listy w typowym języku programowania (w pętli). Tylko tam dostaniesz exception na klatę, że zmieniły się indexy.

Spróbuj poniższe

Kopiuj
with cost_am as(
SELECT up.USER_ID, ura.oid
	FROM 13279_PP pp
	JOIN CUSTOMER_PROFILE cp ON
		cp.CUST_ID = pp.CUST_ID
	JOIN USER_PROFILE up ON
		up.CUST_PROFILE_ID = cp.CUST_PROFILE_ID
	JOIN USER_ROLE_ASSIGNMENT ura ON
		ura.USER_ID = up.USER_ID
		AND URA.ROLE_ID != '43'
)

DELETE FROM ROLE_ASSIGNMENT
WHERE OID in (SELECT oid from cost_am)

inner join działa "inaczej" na różnych silnikach. W tym przypadku powinien wywalić wszystkie rekordy z ROLE_ASSIGNMENT, które matchują się po id z drugą tabelą.

LI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 87
1

Bo w Oracle przy delete musiałaby być struktura +/- taka:

Kopiuj

DELETE FROM ROLE_ASSIGNMENT
WHERE OID in (with cost_am as(
SELECT up.USER_ID, ura.oid
	FROM 13279_PP pp
	JOIN CUSTOMER_PROFILE cp ON
		cp.CUST_ID = pp.CUST_ID
	JOIN USER_PROFILE up ON
		up.CUST_PROFILE_ID = cp.CUST_PROFILE_ID
	JOIN USER_ROLE_ASSIGNMENT ura ON
		ura.USER_ID = up.USER_ID
		AND URA.ROLE_ID != '43'
)
select oid from cost_am

)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.