oracle - salida - Ejecute SCRIPT desde el bloque PL/SQL
procedure oracle ejemplos (5)
ejecutar inmediatamente ''start prompt1'';
Ejecutar inmediato es ejecutar sentencias SQL, no comandos arbitrarios.
¿Puedo obtener un valor de prompt1 en mi bloque PL / SQL donde estoy llamando al script
Puede ejecutar un script de ejecución, pero dudo que pueda capturar la entrada desde un script SQL, especialmente dentro de un bloque PL / SQL.
¿Cómo usar "INICIAR SCRIPT" en el bloque pl / sql?
Quiero usar algo como esto
declare
begin
proc(para1,para2);
execute immediate ''start prompt1'' ;
end;
/
También quiero saber, ¿puedo obtener un valor de prompt1 en mi bloque PL / SQL donde estoy llamando al script? Porque necesito usar el valor para realizar algunas operaciones en el bloque PL / SQL.
Si está usando sql * plus (o una herramienta que lo está usando), puede hacer algo como esto:
set serveroutput on
variable a number;
begin
:a := &promt;
dbms_output.put_line(:a);
end;
/
Si se ejecuta en lote, puede hacer lo siguiente:
variable a number;
begin
:a := &1;
dbms_output.put_line(:a);
end;
y obtener el valor de: a como parámetro-
sqlplus sdad/fdsfd@fdggd @<your_script.sql> <val_for_a>
Puede escribir un bloque pl / sql en SqlPlus para verificar un parámetro de una tabla y luego ejecutar un script. En el script que se ejecutará (MyScript.sql a continuación), los terminadores de declaración deben ser ";" en lugar de "/"
declare
vMyParameter number := 0;
begin
select count(*) into vMyParameter
from MyTable
where MyCheckValue = ''Y'';
if vMyParameter = 1 then
@MyFolder/MyScript.sql;
end if;
end;
/
Es 2012 2017. Los guiones son una resaca torpe y frágil del último milenio. Oracle tiene una fantástica gama de funcionalidades que podemos ejecutar en PL / SQL, además de los procedimientos almacenados de Java, y hay programación para comenzar trabajos. Además de ejecutar DDL para crear o modificar esquemas, casi no hay necesidad de 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ás haciendo con el script que no puedes hacer con un procedimiento almacenado?
En cuanto a pasar entrada a un procedimiento almacenado, para eso están los parámetros. PL / SQL no es interactivo, necesitamos un cliente para ingresar los valores. Dependiendo de la situación, esto puede hacerse 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?
- Podemos escribir un Procedimiento almacenado de Java para ejecutar comandos de shell. Esta es la solución venerable, habiendo estado presente desde Oracle 8i. Descubra más .
- En 10g Oracle, 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. Descubra más .
- Dado que las tablas externas de Oracle 11g R1 admiten scripts de preprocesador, que ejecutan comandos de shell antes de consultar la tabla. Descubra más .
Tenga en cuenta que todas estas opciones requieren 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 ejecutemos un script de shell arbitrario desde PL / SQL.
Finalmente, no está claro qué beneficio se espera al 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 las secuencias de comandos en la máquina del cliente . Esto parece relevante a la luz del requisito de aceptar la entrada del usuario.
Quizás la solución más simple es la reconfiguración del script original. Divida la llamada PL / SQL necesaria en un bloque y luego simplemente llame al script con nombre:
begin
proc(para1,para2);
end;
/
@prompt1.sql
Otra práctica es ejecutar en un *.bat
con parámetros, como:
Ejemplo c: /oracle/bin/sqlplus.exe -w @c: / name
sql% 1% 2 @c: /output.sql