SQL> conn sys/change_on_install Connected. SQL> create user newuser identified by newuser; User created. SQL> grant dba to newuser; Grant succeeded. SQL> grant create table to newuser; Grant succeeded. SQL> conn newuser/newuser; Connected. SQL> create table MY_ERR_TABLE (msg varchar2(900)); Table created. SQL> create or replace 2 PROCEDURE DYNAMIC_SQL (SQL_TEXT IN VARCHAR2) AS 3 source_cursor integer; 4 e VARCHAR2(1000); 5 dummy integer; 6 BEGIN 7 source_cursor := dbms_sql.open_cursor; 8 dbms_sql.parse(source_cursor, 9 SQL_TEXT, dbms_sql.native); 10 dummy := dbms_sql.execute(source_cursor); 11 dbms_sql.close_cursor(source_cursor); 12 EXCEPTION 13 WHEN OTHERS THEN 14 e := sqlerrm; 15 INSERT INTO MY_ERR_TABLE VALUES ('DYNAMIC_SQL '||SQL_TEXT ||' '||e); 16 END; 17 / Procedure created. SQL> exec DYNAMIC_SQL('create table ab (a varchar2(2), b number(5,2))'); PL/SQL procedure successfully completed. SQL> desc ab Name Null? Type ------------------------------- -------- ---- A VARCHAR2(2) B NUMBER(5,2) SQL> drop table ab; Table dropped. SQL> conn sys/change_on_install Connected. SQL> drop user newuser cascade; User dropped. SQL> spool off;