É
Em particular, eu consideraria a tentativa de executar um script SQL de um programa PL/SQL como uma falha de arquitetura. O que você está fazendo com o script que você não pode fazer com um procedimento armazenado?
Quanto à passagem de entrada para um procedimento armazenado, é para isso que servem os parâmetros. PL/SQL não é interativo, precisamos de um cliente para inserir os valores. Dependendo do cenário, isso pode ser feito de forma assíncrona (valores em um arquivo ou tabela) ou de forma síncrona (chamando o procedimento armazenado do SQL*Plus, SQL Developer ou um front-end personalizado).
Dito tudo isso, no mundo real trabalhamos com arquiteturas confusas com interdependências entre o banco de dados e o sistema operacional externo. Então o que nós podemos fazer?
- Podemos escrever um procedimento armazenado Java para executar comandos shell. Esta é a solução venerável, que existe desde o Oracle 8i. Saiba mais.
- No Oracle 10g, substitua DBMS_JOB por DBMS_SCHEDULER. Uma das melhorias desta ferramenta é a capacidade de executar tarefas externas, ou seja, scripts de shell. Saiba mais.
- Como as tabelas externas do Oracle 11g R1 suportam scripts de pré-processador, que executam comandos shell antes de consultar a tabela. Saiba mais.
Observe que todas essas opções exigem acesso elevado (concessões em objetos DIRECTORY, credenciais de segurança etc.). Estes só podem ser concedidos por usuários privilegiados (ou seja, DBAs). A menos que nosso banco de dados tenha uma configuração de segurança surpreendentemente frouxa, não há como executarmos um script de shell arbitrário de PL/SQL.
Por fim, não está claro qual benefício você espera da execução de um script SQL em PL/SQL. Lembre-se que PL/SQL roda no servidor de banco de dados, então não pode ver scripts na máquina cliente . Isso parece relevante à luz do requisito de aceitar a entrada do usuário.
Talvez a solução mais simples seja a reconfiguração do script original. Divida a chamada PL/SQL necessária em um bloco e depois chame o script nomeado:
begin
proc(para1,para2);
end;
/
@prompt1.sql