Olá Radu,
O problema acontece porque Stored Procedures e Functions, como comportamento padrão, executam com os privilégios do OWNER da procedure, que é o usuário que criou ela. Esse comportamento é chamado de Definer’s Rights (DR).
Portanto, para funcionar, você tem duas opções:
1) modificar esse comportamento padrão, definindo a procedure para executar com os privilégios do próprio usuário que está invocando a procedure, chamado de Invoker’s Rights. Para isso se usa a cláusula de AUTHID:
CREATE OR REPLACE PROCEDURE SP_TESTE01 AUTHID CURRENT_USER
IS
BEGIN
EXECUTE IMMEDIATE 'CREATE TABLE TESTE (id CHAR)';
END;
Essa é uma solução, porém assume que o usuário executando possua o system privilege de create table.
2) Se não for o caso, e você quiser realmente usar a procedure para “emprestar” esse privilégio, você não pode ter o system privilege de create table atribuído por ROLE. Ele precisa ser um grant direto ao usuário SIGA, que é o Owner da procedure/function.
grant create table to siga;
A partir de um sysdba.