[ORACLE][RESOLU] Transaction en PL/SQL

Bonjour à tous!

Je dois créer une procédure en PL/SQL pour ajouter des données sur une table principale et sur des tables annexes. Chaque tables annexes peut recevoir plusieurs insertions.
Si l’une des insertions sur les tables annexes foire, j’aimerai que ma procèdure fasse un rollback, histoire de n’avoir que des données complètes dans la base

j’ai fait un truc dans ce genre là :

[code]DECLARE
v_id_tp TABLE_PRINCIPALE.ID_TP%TYPE;
BEGIN
SAVEPOINT start_transaction;

	P_INSERT_TABLE_PRINCIPALE (
		v_id_tp,	-- paramètre en sortie, contient l'identifiant de l'enregistrement inséré
		...);

	P_INSERT_TABLE_ANNEXE1 (
		v_id_tp,
		...);
	
	P_INSERT_TABLE_ANNEXE1 (
		v_id_tp,
		...);
	
	P_INSERT_TABLE_ANNEXE2 (
		v_id_tp,
		...);

	...

	COMMIT;

EXCEPTION
	WHEN OTHERS THEN
		ROLLBACK TO start_transaction;
END;
/
SHOW ERR[/code]

mais j’ai une erreur “ORA-01086: Savepoint never defined” pour start_transaction lorsque je l’exécute :’(

Pouvez-vous m’aider ?

Bizarre cette façon de faire.
Le premier savepoint n’a pas de sens puisque la transaction n’a pas commencée.

C’est tres possible, je suis un gros débutant en transaction B)
Ce que j’essaye de faire, c’est revenir à l’état initial en cas d’erreur.

Quelle est la façon de faire ?

Perso je ferais un simple

EXCEPTION WHEN OTHERS THEN RollBack;

Pas besoin de faire un start_transaction dans ce cas à priori …

Perso je fais aussi une insértion dans une table qui contrôle les erreurs dans ces cas-là, mais bon, c’est juste une façon de faire.

[quote=“Zekiller, post:4, topic: 32206”]Perso je ferais un simple

EXCEPTION WHEN OTHERS THEN RollBack;

Pas besoin de faire un start_transaction dans ce cas à priori …

Perso je fais aussi une insértion dans une table qui contrôle les erreurs dans ces cas-là, mais bon, c’est juste une façon de faire.[/quote]

Ok merci !
Je m’étais compliqué la vie inutilement B)

La table de contrôle c’est une bonne idée, mais j’ai déjà du négocier pour faire le passage de variable entre les procédures en pl/sql et non en VB6 (oui je sais B) ), alors je pense que ça va pas être possible

Si ton block d’insertions insère de GROS volumes de données, fais attention au paramétrage de ta base Oracle. Tu cours le risque de te payer un “snapshot too old” si des accès concurrents aux données sont faits …

Même si j’utilise un simple ROLLBACK plutôt qu’un ROLLBACK TO ?

Je ne pense pas que la quantité de données soit trop importantes, je dirais une dizaine d’enregistrements par table annexe, plus l’enregistrement de la table principale