Oracle
 sql >> Base de données >  >> RDS >> Oracle

Je veux passer un argument variable au fichier SQL externe (PL/SQL avec SQL*Plus)

@ est une commande SQL*Plus , cela n'a aucune signification en PL/SQL. Votre script est inclus dans le bloc PL/SQL au moment de l'analyse, ce que vous pouvez voir si vous list le code dans le tampon. Les variables déclarées dans votre bloc de contrôle sont directement disponibles pour le code "inclus", sans nécessiter de substitution.

Par exemple, si uitvoer.sql contient juste :

dbms_output.put_line(v_s);

Puis ce script de contrôle :

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

list

Produit :

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;

Le bloc PL/SQL dans le tampon a le code inclus, pas une référence à uitvoer.sql . Mais le code inclus fonctionnait car il faisait référence à une variable du script de contrôle qui était toujours dans la portée.

Si vous souhaitez autoriser les variables de contrôle ayant des noms différents, autorisez uitvoer.sql pour être appelé peut-être de manière plus flexible, vous pouvez toujours utiliser des variables de substitution, mais vous substituez toujours le nom de la variable, pas sa valeur. Par exemple, avec ce uitvoer.sql (notez que l'affectation de la variable de substitution ne fait pas avoir des guillemets autour de lui):

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

Et votre script de contrôle en passant le nom de la variable :

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

Vous voyez :

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;