sql >> Databáze >  >> RDS >> Oracle

Chci předat argument proměnné do externího souboru SQL (PL/SQL s SQL*Plus)

@ je příkaz SQL*Plus , nemá v PL/SQL žádný význam. Váš skript je v době analýzy zahrnut do bloku PL/SQL, což můžete vidět, pokud list kód ve vyrovnávací paměti. Proměnné deklarované ve vašem řídicím bloku jsou dostupné pro 'zahrnutý' kód přímo, bez nutnosti substituce.

Například uitvoer.sql obsahuje pouze:

dbms_output.put_line(v_s);

Pak tento řídicí skript:

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

list

Vyrábí:

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;

Blok PL/SQL ve vyrovnávací paměti má zahrnutý kód, ne odkaz na uitvoer.sql . Ale zahrnutý kód fungoval, protože odkazoval na proměnnou z řídicího skriptu, který byl stále v rozsahu.

Pokud chcete povolit, aby řídicí proměnné měly různé názvy, povolte uitvoer.sql chcete-li být voláni pružněji, pak můžete stále používat substituční proměnné, ale stále dosazujete název proměnné, nikoli její hodnotu. Například s tímto uitvoer.sql (všimněte si, že přiřazení substituční proměnné není mít kolem něj uvozovky):

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

A váš řídicí skript předávající název proměnné:

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

Vidíte:

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. nolock na dočasné tabulce v SQL Server 2008

  2. Jak nainstalovat klenot MySQL na Mac OS X

  3. Typy dat SQLite

  4. Chyba instalace mysql-python:Nelze otevřít začleněný soubor 'config-win.h'