No, you can't depend on this. SQL is declarative, not procedural, so within a statement you can't guarantee the order of execution. Since the entire INSERT ALL statement is considered a single statement (doc), you can't guarantee that one INSERT will be before another.
By definition an INSERT FIRST must execute the first INTO passing the evaluated conditions. We might expect INSERT ALL to behave similarly. This appears to be the case:
DROP TABLE T1;
CREATE TABLE T1 AS (SELECT 'a' c1, 0 c2, 0 c3 FROM dual WHERE 1=2);
INSERT ALL
WHEN mod(x,2)<>0 THEN INTO T1 VALUES ('a', x, mod(x,2))
WHEN mod(x,2)=0 THEN INTO T1 VALUES ('b', x, mod(x,2))
SELECT Level x FROM dual CONNECT BY Level <=20;
COMMIT;
SELECT rowid, c1, c2, c3 FROM t1;
However, even though we can demonstrate a particular behavior on a particular platform/version/patchset still doesn't make this a guarantee.
Oracle-developer.net says it explicitly:
the conditions in an INSERT FIRST statement will be evaluated in order
from top to bottom. Oracle makes no such guarantees with an INSERT ALL
statement.
INSERT ALL? – Phil Aug 29 '12 at 19:48insert all- that may be Isaac's reason? – Jack Douglas♦ Aug 30 '12 at 14:06INSERT ALLhas lots of limitations: no parallel execution, no insert in a view. This leads me to think that this statement is less optimized that standardINSERTstatements, especially when inserting in multiple tables. – Vincent Malgrat Aug 30 '12 at 14:24