Bonjour,
Si on considère le code suivant :
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
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;
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) ?
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;
2/ Est-ce qu'en PL/SQL, on peut faire des gestions de transactions imbriquées ?
Merci pour vos retours,
Partager