Usuwanie wielu wierszy razem z powiązaniami

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 ?

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;
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

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ą.

1

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


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

)

1 użytkowników online, w tym zalogowanych: 0, gości: 1