2011-01-23 23 views
9

Tengo un procedimiento como:Cómo ejecutar secuencias de comandos SQL de un procedimiento de SQL PL

CREATE OR REPLACE PROCEDURE test is 
BEGIN 

    DBMS_OUTPUT.PUT_LINE('This is a Test'); 
END; 

Quiero ejecutar algunas secuencias de comandos SQL almacenados en el directorio actual. Podría ejecutarlos desde sqlplus con '@ scriptname.sql', pero ¿cómo puedo hacerlo desde dentro del procedimiento? Por ejemplo:

CREATE OR REPLACE PROCEDURE test is 
BEGIN 

    DBMS_OUTPUT.PUT_LINE('This is a Test'); 
    @scriptname.sql 

END; 

¡Esto no parece funcionar! ¿Hay un script específico para ejecutar sql desde los procedimientos de pl/sql?

+0

Tiene sentido para mí incluir las referencias de secuencia de comandos en un procedimiento almacenado (o anónimo, para el caso) - no importa el problema con la ubicación del script. Puede ejecutar scripts desde un solo script maestro utilizando SQLPlus, sin la necesidad del procedimiento almacenado. –

+0

Supongo que se trata de una gran simplificación de las necesidades reales de OP ... – DCookie

Respuesta

1

Se podría escribir un Java Stored Procedure para abrir el archivo y devolver su contenido como una cadena y luego llamar Execute Immediate en la cadena.

Sea MUY CUIDADO haciendo esto, ya que cualquier sql malicioso en esos archivos puede hacer prácticamente lo que quiera.

+1

Esto no funcionará si el archivo SQL contiene instrucciones SELECT (¿A dónde deben ir los datos seleccionados? Ejecutar Inmediato no lo mostrará en la pantalla) o Las sentencias de SQLplus como EXEC, SET ESC, etc. Además, es probable que necesites leerlas y ejecutarlas instrucción por instrucción, lo que tampoco es fácil. – Codo

10

No puede, en general, porque el pl/sql se ejecuta en la base de datos, en el servidor, y sqlplus es un proceso del cliente. El servidor no puede confiar ni siquiera en el mismo sistema que el cliente y sus archivos, y mucho menos saber nada sobre cómo encontrar el archivo al que se refiere el cliente. Incluso si la sintaxis fuera compatible (y no lo es), su script sql tendría que estar en el servidor, en una ubicación que el servidor conocía y tenía acceso.

+0

Si va a rechazar una respuesta, explique por qué ... – DCookie

4

Puede ejecutar un comando del sistema operativo para iniciar SQLPlus y hacer que ejecute los scripts. Puede pasar un nombre de archivo a SQLplus al inicio y lo ejecutará.

Google Procedimientos externos y extproc o this article. O algo así call OS command with Java

+1

sí +1 - pero, por favor, no haga esto para ejecutar scripts ... – Randy

+0

Y todavía se ejecuta en el servidor, no en el cliente. – DCookie

+0

En realidad, ejecutar en el servidor o en otro lugar es solo uno de los detalles que deberán codificarse.Ciertamente, no digo que sea fácil, pero si existe la posibilidad de ejecutar código en el servidor y hacer que se ejecute en otro lugar. Habrá un lío de firewall, problemas de RPC (o similares), etc. para resolver, pero es posible. No es algo en lo que vería mucho mérito, pero no conozco el escenario del solicitante. – Karl

1

Incluso si debe haber una solución, no recomendaría a esto. Un procedimiento PL/SQL básicamente es un script SQL. O bien 1. ejecute sus scripts SQL desde fuera de la base de datos, p. mediante script de shell o 2. Mueva el código SQL dentro de su procedimiento.

8

En realidad, puede hacer esto en SQL * Plus - sólo tiene que asegurar la @ es el primer carácter de la línea, por ejemplo:

CREATE OR REPLACE PROCEDURE test is 
BEGIN 

    DBMS_OUTPUT.PUT_LINE('This is a Test'); 
@scriptname.sql 

END; 

SQL * Plus leerá el contenido completo de la secuencia de comandos e insertarlo en ese punto en el procedimiento, luego crea el procedimiento tal como se proporciona. Eso significa que no puede tener comandos SQL * Plus en scriptname.sql. Además, no habrá ninguna referencia a @ scriptname.sql en el procedimiento real creado en la base de datos.

Cuestiones relacionadas