sql >> Base de Datos >  >> RDS >> Oracle

Ejecutar SCRIPT desde el bloque PL/SQL

Es 2012 2017. Los guiones son una resaca tosca y quebradiza del último milenio. Oracle tiene una gama fantástica de funciones que podemos ejecutar en PL/SQL, además de procedimientos almacenados de Java y programación para iniciar trabajos. Además de ejecutar DDL para crear o modificar esquemas, casi no se necesitan scripts en un entorno de base de datos Oracle; incluso los scripts DDL deben activarse desde un cliente externo, probablemente una herramienta de compilación como TeamCity.

En particular, consideraría intentar ejecutar un script SQL desde un programa PL/SQL como una falla arquitectónica. ¿Qué está haciendo con el script que no puede hacer con un procedimiento almacenado?

En cuanto a pasar la entrada a un procedimiento almacenado, para eso están los parámetros. PL/SQL no es interactivo, necesitamos un cliente para ingresar los valores. Según el escenario, esto se puede hacer de forma asíncrona (valores en un archivo o una tabla) o de forma síncrona (llamando al procedimiento almacenado desde SQL*Plus, SQL Developer o una interfaz personalizada).

Habiendo dicho todo eso, en el mundo real trabajamos con arquitecturas desordenadas con interdependencias entre la base de datos y el sistema operativo externo. Entonces, ¿qué podemos hacer?

  1. Podemos escribir un procedimiento almacenado de Java para ejecutar comandos de shell. Esta es la solución venerable, que existe desde Oracle 8i. Obtenga más información.
  2. En Oracle 10g, reemplace DBMS_JOB con DBMS_SCHEDULER. Una de las mejoras de esta herramienta es su capacidad para ejecutar trabajos externos, es decir, scripts de shell. Obtenga más información.
  3. Dado que Oracle 11g R1, las tablas externas admiten scripts de preprocesador, que ejecutan comandos de shell antes de consultar la tabla. Obtenga más información.

Tenga en cuenta que todas estas opciones exigen acceso elevado (concesiones en objetos DIRECTORIO, credenciales de seguridad, etc.). Estos solo pueden ser otorgados por usuarios privilegiados (es decir, DBA). A menos que nuestra base de datos tenga una configuración de seguridad sorprendentemente laxa, no hay forma de que podamos ejecutar un script de shell arbitrario desde PL/SQL.

Finalmente, no está claro qué beneficio espera de ejecutar un script SQL en PL/SQL. Recuerde que PL/SQL se ejecuta en el servidor de la base de datos, por lo que no puede ver scripts en la máquina cliente . Esto parece relevante a la luz del requisito de aceptar la entrada del usuario.

Quizás la solución más sencilla sea la reconfiguración del script original. Divida la llamada PL/SQL necesaria en un bloque y luego simplemente llame al script nombrado:

begin
   proc(para1,para2);
end;
/   
@prompt1.sql