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

Quiero pasar un argumento variable a un archivo SQL externo (PL/SQL con SQL*Plus)

@ es un comando SQL*Plus , no tiene significado en PL/SQL. Su secuencia de comandos se incluye dentro del bloque PL/SQL en el momento del análisis, que puede ver si list el código en el búfer. Las variables declaradas en su bloque de control están disponibles para el código 'incluido' directamente, sin necesidad de sustitución.

Como ejemplo, si uitvoer.sql solo contiene:

dbms_output.put_line(v_s);

Entonces este script de control:

set serveroutput on
declare
  v_s varchar2(10) := 'Test';
begin
  @uitvoer.sql
end;
/

list

Produce:

Test

PL/SQL procedure successfully completed.

  1  declare
  2    v_s varchar2(10) := 'Test';
  3  begin
  4  dbms_output.put_line(v_s);
  5* end;

El bloque PL/SQL en el búfer tiene el código incluido, no una referencia a uitvoer.sql . Pero el código incluido funcionó porque se refería a una variable del script de control que todavía estaba dentro del alcance.

Si desea permitir que las variables de control tengan nombres diferentes, permita uitvoer.sql para ser llamado de manera más flexible quizás, entonces aún puede usar variables de sustitución, pero aún está sustituyendo el nombre de la variable, no su valor. Por ejemplo, con este uitvoer.sql (tenga en cuenta que la asignación de variable de sustitución no tiene comillas a su alrededor):

declare
  variable_s varchar2(10);
begin
  variable_s := &&1;
  dbms_output.put_line(variable_s);
end;

Y su script de control pasando el nombre de la variable:

declare
  v_s varchar2(10) := 'Test';
begin
  @uitvoer.sql v_s
end;
/

Ves:

old   7:   variable_s := &&1;
new   7:   variable_s := v_s;
Test

PL/SQL procedure successfully completed.

  1  declare
  2    v_s varchar2(10) := 'Test';
  3  begin
  4  declare
  5    variable_s varchar2(10);
  6  begin
  7    variable_s := &&1;
  8    dbms_output.put_line(variable_s);
  9  end;
 10* end;