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.