Oracle
 sql >> Database >  >> RDS >> Oracle

Voglio passare un argomento variabile a un file SQL esterno (PL/SQL con SQL*Plus)

@ è un comando SQL*Plus , non ha significato in PL/SQL. Il tuo script viene incluso nel blocco PL/SQL al momento dell'analisi, che puoi vedere se list il codice nel buffer. Le variabili dichiarate nel tuo blocco di controllo sono disponibili direttamente al codice 'incluso', senza necessità di sostituzione.

Ad esempio, se uitvoer.sql contiene solo:

dbms_output.put_line(v_s);

Quindi questo script di controllo:

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;

Il blocco PL/SQL nel buffer ha il codice incluso, non un riferimento a uitvoer.sql . Ma il codice incluso ha funzionato perché si riferiva a una variabile dello script di controllo che era ancora nell'ambito.

Se si desidera consentire alle variabili di controllo di avere nomi diversi, consentire uitvoer.sql per essere chiamato in modo più flessibile forse, puoi ancora usare le variabili di sostituzione, ma stai ancora sostituendo il nome della variabile, non il suo valore. Ad esempio, con questo uitvoer.sql (nota che l'assegnazione della variabile di sostituzione non ci sono delle virgolette):

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

E il tuo script di controllo che passa il nome della variabile:

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

Vedi:

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;