Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie können Sie dieselbe Abfrage mehrmals mit einer Schleife in PL/SQL ausführen?

Die Substitutionsvariablen &counter , &id und &name werden jeweils einmal ausgewertet, wenn der PL/SQL-Block kompiliert wird - nicht während es ausgeführt wird.

Die Variablen werden und können nicht innerhalb des PL/SQL-Blocks neu bewertet oder hochgestuft werden. Der Block wird als einzelne Einheit innerhalb der Datenbank ausgeführt - sobald er zur Ausführung übermittelt wurde, ist er unabhängig vom Client, der nur darauf wartet, dass er abgeschlossen wird (es sei denn, Sie unterbrechen ihn, was der Client ebenfalls handhabt). PL/SQL ist keine interaktive Sprache, und Sie sollten Client-Funktionalität (z. B. Substitutionsvariablen) nicht mit SQL- oder PL/SQL-Funktionalität verwechseln.

Nur zum Spaß könnten Sie ein Skript basierend auf counter generieren die die entsprechende Anzahl von Eingabeaufforderungen für IDs und Namen ausführt und sie in ein Format bringt, das durch eine einfache Einfügung verwendet werden könnte:

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;

Dadurch wird eine Datei namens prompter.sql erstellt (Ich habe es in /tmp abgelegt; legen Sie es an einer für Ihre Umgebung geeigneten Stelle ab!); Wenn die Eingabeaufforderung „Anzahl der Wertepaare“ mit 2 beantwortet wird, würde das temporäre Skript wie folgt aussehen:

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'"

Dieses temporäre Skript wird dann mit @ ausgeführt , der den Benutzer zur Eingabe all dieser individuellen Werte auffordert. Und dann werden Tabellensammlungen, die aus den kombinierten Substitutionsvariablen erstellt wurden, in einer Auswahl verwendet, die von der Einfügung verwendet wird.