Bonjour,
Si on considère le code suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
CREATE OR REPLACE PROCEDURE DOUPDATES
(
  VAL1 IN VARCHAR2
, res out number
, errorText out varchar2) as
err exception;
begin
 
--start transaction;
res := 0;
errorText := '';
 
if VAL1 is null then
	res := -1;
	errorText := 'val1 is mandatory';
	raise err;
end if;
 
--firstInsert
insert into table1 (...)
select ...
from table1
where ...;
 
--secondInsert
insert into table2 (...)
select ...
from table2
where ...;
 
--thirdInsert
insert into table3 (...)
select ...
from table3
where ...;
 
...
 
dbms_output.put_line('WENT FINE');
 
commit;
 
Exception
   when err then
      dbms_output.put_line('WENT WRONG');
      rollback;
   when others then
      dbms_output.put_line('WENT WRONG');
      res := SQLCODE;
      errorText := SUBSTR(SQLERRM, 1, 100);
	  rollback;
 
null;
END DOUPDATES;
Appel de la manière suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
declare
	VAL1 VARCHAR2(12);
	res number;
	errorText varchar2(32767);
begin
	VAL1 := 'toto';
	DOUPDATES(VAL1, res, errorText);
	if res != 0 then
		dbms_output.put_line('An error occured : ''' || errorText || '''');
	else
		dbms_output.put_line('OK');
	end if;
end;
1/ Je ne comprends pas pourquoi le "start transaction;" fait planter la compilation quand je le décommente (c'est mon premier code en PL/SQL après des années de T-SQL...) ? Je me demande du coup si ma gestion de transaction est correcte (sans rentrer dans la problématique de savoir s'il vaut mieux gérer les transactions par le code appelant la procédure stockée) ?

2/ Est-ce qu'en PL/SQL, on peut faire des gestions de transactions imbriquées ?

Merci pour vos retours,