Bonjour,

Sur le site Ask Tom, un post de 2002 (oui, je sais, c'est vieux) dit que pour un DDL, un Commit est fait AVANT et APRES le DDL!

Voici ce que dit Tom : https://asktom.oracle.com/pls/asktom...:7072180788422
"DDL is done conceptually like this:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
begin
COMMIT;
do the ddl;
COMMIT;
exception
when others then
ROLLBACK;
raise;
end;
"
En cherchant sur le net, je tombe sur un post de Steven Feuerstein, le responsable chez Oracle du PL/SQL qui dit la même chose mais en 2016!
http://stevenfeuersteinonplsql.blogspot.fr/2016/10/execution-of-ddl-in-plsql-commits-twice.html
"You'd think that after working with Oracle Database and PL/SQL since 1990, I'd know everything.

For example, I had long known that when you execute a DDL (data definition language) statement in PL/SQL (which must be done as dynamic SQL via EXECUTE IMMEDIATE or DBMS_SQL.PARSE /EXECUTE) a commit is executed implicitly after the statement.

What I'd somehow missed was that a commit is also performed before the DDL statement is executed. So that is the point of this post:
Oracle Database issues a commit before a DDL statement is executed, and then afterwards as well."

Et puis, en cherchant encore, je tombe sur la doc officielle d'Oracle qui dit la même chose.
https://docs.oracle.com/cd/B19306_01...0/transact.htm
"Overview of Transaction Management
A transaction ends when any of the following occurs:
A user runs a DDL statement such as CREATE, DROP, RENAME, or ALTER. If the current transaction contains any DML statements, Oracle first commits the transaction, and then runs and commits the DDL statement as a new, single statement transaction."

Là où je suis embêté c'est que je n'arrive pas à reproduire ce comportement...
En SQL, voilà ce que j'ai fait :
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
SQL> CREATE TABLE TEST_PL01 (ID NUMBER(5,2));
Table créée.
 
SQL> insert into test_pl01 values(1);
1 ligne créée.
 
-- Je provoque une erreur pour voir si un COMMIT a bien lieu avant le CREATE TABLE. Si oui, je ne pourrai pas rollbacker l'INSERT.
SQL> CREATE TABLE TABLE (ID NUMBER(5,2));
CREATE TABLE TABLE (ID NUMBER(5,2))
             *
ERREUR à la ligne 1 :
ORA-00903: nom de table non valide
 
SQL> select * from test_pl01;
 
        ID
----------
         1
 
-- Aïe, le ROLLBACK fonctionne donc le premier COMMIT avant l'exécution du DDL n'a pas eu lieu.
SQL> rollback;
Annulation (rollback) effectuée.
SQL> select * from test_pl01;
aucune ligne sélectionnée
Mes tests en PL/SQL ne sont pas mieux donc si quelqu'un avait une idée pour tester ce comportement, je suis preneur!
Bon week-end à vous tous.