Two errors:
- BL_STARTDATE Date
, - a superfluous comma
- Dynamic SQL shouldn't end with a semi-colon (your last line).
Standard procedure (when dealing with dynamic SQL) is to display the statement on the screen (DBMS_OUTPUT would do). If copy/paste of the same statement works OK in SQL*Plus, it'll most probably be OK in PL/SQL.
Code:
SQL> declare
2 l_str varchar2(1000);
3 begin
4 l_str := '
5 Create table BILLING (
6 BL_CODE Number (8) PRIMARY KEY,
7 BL_STATUS Varchar2 (10) NOT NULL,
8 BL_CONTACTDATE Date,
9 BL_CLOSEDATE Date,
10 BL_TOTAL Decimal (7,2) NOT NULL,
11 BL_AMOUNTPAID Decimal (7,2),
12 BL_OUTSTANDING Decimal (7,2),
13 BL_STARTDATE Date
14 )';
15 execute immediate l_str;
16 end;
17 /
PL/SQL procedure successfully completed.
SQL> desc billing;
Name Null? Type
----------------------------------------------------- -------- ----------------
BL_CODE NOT NULL NUMBER(8)
BL_STATUS NOT NULL VARCHAR2(10)
BL_CONTACTDATE DATE
BL_CLOSEDATE DATE
BL_TOTAL NOT NULL NUMBER(7,2)
BL_AMOUNTPAID NUMBER(7,2)
BL_OUTSTANDING NUMBER(7,2)
BL_STARTDATE DATE
SQL>
P.S. On a second thought, is it PL/SQL you are dealing with? This statement ("I am trying to pass my DDL ...") made me think so.