As Connor says, if you want to run DDL in PL/SQL you have to use execute immediate. This is still the case:
SQL> select * from v$version;
BANNER CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c EE Extreme Perf Release 12.1.0.2.0 - 64bit Production 0
PL/SQL Release 12.1.0.2.0 - Production 0
CORE 12.1.0.2.0 Production
TNS for Linux: Version 12.1.0.2.0 - Production 0
NLSRTL Version 12.1.0.2.0 - Production 0
5 rows selected.
SQL>
SQL> select * from t;
select * from t
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL>
SQL> begin
2 create table t (x int);
3 end;
4 /
create table t (x int);
*
ERROR at line 2:
ORA-06550: line 2, column 3:
PLS-00103: Encountered the symbol "CREATE" when expecting one of the following:
( begin case declare exit for goto if loop mod null pragma
raise return select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
continue close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe purge
SQL>
SQL> begin
2 execute immediate 'create table t (x int)';
3 end;
4 /
PL/SQL procedure successfully completed.
SQL>
SQL> select * from t;
no rows selected