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

Come puoi eseguire la stessa query più volte usando il ciclo in PL/SQL?

Le variabili di sostituzione &counter , &id e &name vengono valutati ciascuno una volta, quando il blocco PL/SQL viene compilato - non mentre viene eseguito.

Le variabili non sono e non possono essere rivalutate o ripromosse all'interno del blocco PL/SQL. Il blocco viene eseguito come una singola unità all'interno del database:una volta inviato per l'esecuzione, è indipendente dal client, che attende solo il completamento (a meno che non lo si interrompa, cosa che gestisce anche il client). PL/SQL non è un linguaggio interattivo e non dovresti confondere la funzionalità client (ad es. variabili di sostituzione) con la funzionalità SQL o PL/SQL.

Solo per divertimento, potresti generare uno script basato su counter che esegue il numero appropriato di richieste per ID e nomi e li inserisce in un formato che potrebbe essere utilizzato con un semplice inserto:

set serveroutput on
set feedback off
set echo off
set verify off
set termout off

accept counter "How many value pairs do you want to insert?"

var ids varchar2(4000);
var names varchar2(4000);

spool /tmp/prompter.sql

begin
  -- prompt for all the value pairs
  for i in 1..&counter loop
    dbms_output.put_line('accept id' ||i|| ' number  "Enter ID ' ||i|| '"');
    dbms_output.put_line('accept name' ||i|| '  char "Enter name ' ||i|| '"');
  end loop;

  -- concatenate the IDs into one variable
  dbms_output.put('define ids="');
  for i in 1..&counter loop
    if i > 1 then
      dbms_output.put(',');
    end if;
    dbms_output.put('&'||'id'||i);
  end loop;
  dbms_output.put_line('"');

  -- concatenate the names into one variable
  dbms_output.put('define names="');
  for i in 1..&counter loop
    if i > 1 then
      dbms_output.put(',');
    end if;
    -- each name wrapped in single quotes
    dbms_output.put(q'['&]'||'name'||i||q'[']');
  end loop;
  dbms_output.put_line('"');
end;
/
spool off

@/tmp/prompter

insert into customer (id, name)
select i.id, n.name
from (
  select rownum as rid, column_value as id 
  from table(sys.odcinumberlist(&ids))
) i
join (
  select rownum as rid, column_value as name
  from table(sys.odcivarchar2list(&names))
) n
on n.rid = i.rid;

select * from customer;

Questo crea un file chiamato prompter.sql (L'ho messo in /tmp; mettilo in un posto adatto al tuo ambiente!); con il prompt "numero di coppie di valori" che ha risposto come 2, lo script temporaneo sembrerebbe contenere:

accept id1 number  "Enter ID 1"
accept name1  char "Enter name 1"
accept id2 number  "Enter ID 2"
accept name2  char "Enter name 2"
define ids="&id1,&id2"
define names="'&name1','&name2'"

Lo script temporaneo viene quindi eseguito con @ , richiedendo all'utente tutti quei valori individuali. E poi le raccolte di tabelle costruite dalle variabili di sostituzione combinate vengono utilizzate in una selezione, che viene utilizzata dall'inserto.