sql >> Database >  >> RDS >> Oracle

Ik wil een variabel argument doorgeven aan een extern SQL-bestand (PL/SQL met SQL*Plus)

@ is een SQL*Plus-opdracht , heeft het geen betekenis in PL/SQL. Uw script wordt tijdens de parse-tijd in het PL/SQL-blok opgenomen, wat u kunt zien als u list de code in de buffer. De variabelen die in uw controleblok zijn gedeclareerd, zijn direct beschikbaar voor de 'inbegrepen' code, zonder vervanging.

Als bijvoorbeeld uitvoer.sql bevat alleen:

dbms_output.put_line(v_s);

Dan dit controlescript:

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

list

Produceert:

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;

Het PL/SQL-blok in de buffer heeft de meegeleverde code, niet een verwijzing naar uitvoer.sql . Maar de meegeleverde code werkte omdat deze naar een variabele uit het controlescript verwees die nog steeds binnen het bereik was.

Als u wilt dat de controlevariabelen verschillende namen hebben, moet u uitvoer.sql . toestaan om flexibeler genoemd te worden misschien, dan kun je nog steeds substitutievariabelen gebruiken, maar je vervangt nog steeds de naam van de variabele, niet de waarde ervan. Bijvoorbeeld met deze uitvoer.sql (merk op dat de toewijzing van de vervangingsvariabele niet zet er aanhalingstekens omheen):

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

En je controlescript geeft de variabelenaam door:

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

Je ziet:

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;



  1. Voorkom gelijktijdige transacties in een webapplicatie

  2. Hoe intersectie op een compositietabel te doen

  3. Gegevens tussen twee datums selecteren?

  4. VB.net - afbeelding invoegen/ophalen uit mysql-database rechtstreeks naar/van een Picturebox