Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Execute o SCRIPT do bloco PL/SQL


É 2012 2017. Os roteiros são uma ressaca desajeitada e frágil do último milênio. O Oracle tem uma fantástica variedade de funcionalidades que podemos executar em PL/SQL, além de Java Stored Procedures e agendamento para iniciar jobs. Além de executar DDL para criar ou alterar esquemas, quase não há necessidade de scripts em um ambiente de banco de dados Oracle; mesmo scripts DDL devem ser acionados a partir de um cliente externo, provavelmente uma ferramenta de construção como TeamCity.

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?
  1. Podemos escrever um procedimento armazenado Java para executar comandos shell. Esta é a solução venerável, que existe desde o Oracle 8i. Saiba mais.
  2. 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.
  3. 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