I read this article in one of the Oracle's user forum...
How to write a code for using temporary tables in PL/Sql ???
One way to do this is to define a record in the package Specification, which contain the colums you want...and then built a table based on this record...
Create Package name_pkg AS
TYPE employee_rec IS RECORD
/* define colums directly or via colums in
a table, which means same dataformat */
(deptno dept_table.deptno%TYPE,
empno NUMBER, empname VARCHAR2(40));
TYPE employee_tab IS TABLE OF emplyoee_rec INDEX BY BINARY_INTEGER;
"There's an inherently poor issue about using DDL within PL/SQL at all, it limits concurrency, saps performance, and clobbers multi-user capability in the database. Generally speaking, when there are genuine occasions to use temporary tables (these are rare, but usually for performance or denormalization) it is best to actually use a PL/SQL table, rather than a temporary table. They're instantiated independently and don't suffer from most of the drawbacks of temporary tables. When you do this, it's best to use %TYPE to avoid latent dependencies"

Is this true ? Are temporary tables a bad choice ?
We use them at many places in our application when we want to copy tree or move the tree... to store intermediate records.
We do have reported timeout errors some times. Can these temporary tables be culprit ??