Por que você deseja criar uma tabela temporária em um procedimento armazenado em primeiro lugar?
É relativamente comum criar tabelas temporárias em outros bancos de dados (SQL Server e MySQL, por exemplo). É muito, muito raro fazer a mesma coisa no Oracle. Em quase todos os casos em que você é tentado a criar uma tabela temporária no Oracle, há uma abordagem arquitetural melhor. Há um tópico na pilha de DBA que discute alternativas para tabelas temporárias e por que eles geralmente não são necessários no Oracle.
Programaticamente, você pode criar objetos usando SQL dinâmico
CREATE OR REPLACE PROCEDURE dont_do_this
AS
BEGIN
EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE a( id INTEGER )';
END;
Se você criar uma tabela temporária dinamicamente, no entanto, todas as referências a essa tabela também precisarão ser via SQL dinâmico - você não poderá escrever
SELECT
simples declarações contra a mesa. E a definição de uma tabela temporária no Oracle é global, portanto, é visível para todas as sessões. Se você tiver duas sessões diferentes tentando criar a mesma tabela, a segunda sessão receberá um erro. Se você espera que a tabela tenha uma definição diferente em sessões diferentes, você terá ainda mais problemas.