Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Eu quero passar um argumento de variável para um arquivo SQL externo (PL/SQL com SQL*Plus)


@ é um comando SQL*Plus , não tem significado em PL/SQL. Seu script está sendo incluído no bloco PL/SQL no momento da análise, o que você pode ver se list o código no buffer. As variáveis ​​declaradas em seu bloco de controle estão disponíveis para o código 'incluído' diretamente, sem necessidade de substituição.

Por exemplo, se uitvoer.sql contém apenas:
dbms_output.put_line(v_s);

Então este script de controle:
set serveroutput on
declare
  v_s varchar2(10) := 'Test';
begin
  @uitvoer.sql
end;
/

list

Produz:
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;

O bloco PL/SQL no buffer tem o código incluído, não uma referência a uitvoer.sql . Mas o código incluído funcionou porque se referia a uma variável do script de controle que ainda estava no escopo.

Se você deseja permitir que as variáveis ​​de controle tenham nomes diferentes, permitindo uitvoer.sql para ser chamado de forma mais flexível, talvez, você ainda pode usar variáveis ​​de substituição, mas ainda está substituindo o nome da variável, não seu valor. Por exemplo, com este uitvoer.sql (observe que a atribuição da variável de substituição não tem aspas em torno dele):
declare
  variable_s varchar2(10);
begin
  variable_s := &&1;
  dbms_output.put_line(variable_s);
end;

E seu script de controle passando o nome da variável:
declare
  v_s varchar2(10) := 'Test';
begin
  @uitvoer.sql v_s
end;
/

Você vê:
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;