Q: How can I create a table with a unique name and then insert data from another table into that table, preferably using a single trigger I want to have an empty table, when someone inserts data into it, I then want that table to be immediately copied to a unique table name and then the original table truncated in readiness for the same thing to happen again.
I've tried doing this with a trigger that then executes a procedure, and I've tried just doing this with a trigger only and I get issues with both.
CREATE OR REPLACE TRIGGER REPLICATE_PDU_TABLE
AFTER INSERT ON PDU 
DECLARE V_TABLENAME VARCHAR2(30) := 'PDU_IN_PROGRESS_ || TO_CHAR(SYSDATE, 'YYYYMMDDHHMISS');
CURSOR C1 IS
SELECT * FROM PDU;
V_PDU C1%ROWTYPE;
BEGIN 
EXECUTE IMMEDIATE 'CREATE TABLE ' || V_TABLENAME || ' AS SELECT * FROM PDU';
OPEN C1;
FETCH C1 INTO PDU ;
CLOSE C1;
INSERT INTO V_TABLENAME
VALUES (
V_PDU.TARGETSCHEMA,
V_PDU.PRODUCTIONSCHEMA,
V_PDU.PRODUCTIONDATABASE,
V_PDU.TABLE_NAME,
V_PDU.DRIVER_TABLE,
V_PDU.MANDATORY_JOIN,
V_PDU.ADDITIONAL_JOINS,
V_PDU.TABLE_COMPRESSION);
END TRIGGER REPLICATE_PDU_TABLE;

This "May" actually work, but I can't the trigger to compile because "INSERT INTO V_TABLENAME" won't work, as the table does not yet exist. This is the first part of my code, create a unique table, copy all of the data from the original table into it, upon insert. 

A: This is really not the sort of thing we should do in a trigger. There's some complicated processing which is tricky to manage. For instance, what should happen in you can't create a trigger? Or if the truncation fails? 
This is compounded by the prohibition on issuing commits in triggers. All DDL statements issue commits (two per statement) so the only way to fire DDL statements  from a trigger is to use the autonomous_transaction pragma. This is is a nested transaction, which means it cannot see the current contents of the table. So the whole thing is a bit messy.
Here is a thought experiment which illustrates the sort of thing you would need to do: 
create or replace trigger replicate_pdu_table
    after insert on pdu 
declare 
    -- note use the twenty-hour clock in mask
    v_tablename varchar2(30) := 'PDU_IN_PROGRESS_' || to_char(sysdate, 'YYYYMMDDHH24MISS');
    procedure create_table is
        pragma autonomous_transaction;
    begin
        execute immediate 'create table ' || v_tablename || ' as select * from pdu where 1=2';
    end create_table;
    procedure truncate_pdu is
        pragma autonomous_transaction;
    begin
        execute immediate 'truncate table pdu';
    end truncate_pdu;
begin 
    create_table;
    execute immediate 'insert into ' || v_tablename || ' select * from pdu';
    truncate_pdu;
end;
/

The problem is the truncation: it hurls
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

The reason being the trigger fires when we insert rows into pdu. That is, before we can issue a commit. Consequently the main session has a lock on pdu so the autonomous transaction can't do the truncate. This is an absolute blocker to the use of a trigger: you need to run this as a procedure, perhaps called from a polling job or via a queue.

The wider question is, why are you doing this? A transactional approach which creates tables on the fly is always a smell. Apart from the proliferation of itty-bitty cluttering the schema there are the risks of failure which I mentioned in the intro. Also, how will the processes consuming the created table know its name???? Your entire process will be built out of dynamic SQL. This is a maintenance and support nightmare.
Without knowing the details of what you're trying to achieve it's not possible to suggest a better approach. But be assured, there are definitely better approaches available to you. 

A: Execute insert statement also using execute immediate command as shown below:
CREATE OR REPLACE TRIGGER REPLICATE_PDU_TABLE
AFTER INSERT ON PDU 
DECLARE V_TABLENAME VARCHAR2(30) := 'PDU_IN_PROGRESS_ || TO_CHAR(SYSDATE, 'YYYYMMDDHHMISS');
CURSOR C1 IS
SELECT * FROM PDU;
V_PDU C1%ROWTYPE;
BEGIN 
EXECUTE IMMEDIATE 'CREATE TABLE ' || V_TABLENAME || ' AS SELECT * FROM PDU';
OPEN C1;
FETCH C1 INTO v_PDU ;
CLOSE C1;
EXECUTE IMMEDIATE '
INSERT INTO '|| V_TABLENAME || '
VALUES ( '||
V_PDU.TARGETSCHEMA ||','||
V_PDU.PRODUCTIONSCHEMA ||','||
V_PDU.PRODUCTIONDATABASE ||','||
V_PDU.TABLE_NAME ||','||
V_PDU.DRIVER_TABLE ||','||
V_PDU.MANDATORY_JOIN||','||
V_PDU.ADDITIONAL_JOINS ||','||
V_PDU.TABLE_COMPRESSION ||')';
END TRIGGER REPLICATE_PDU_TABLE;

You can also check the following link to learn how to use execute immediate statement. 
Execute Immediate Example
