Променливите за заместване &counter
, &id
и &name
всеки се оценява веднъж, когато PL/SQL блокът е компилиран - не докато се изпълнява.
Променливите не са и не могат да бъдат преоценени или повторно повишени в PL/SQL блока. Блокът се изпълнява като единична единица в базата данни - след като е изпратен за изпълнение, той е независим от клиента, който просто чака да завърши (освен ако не го прекъснете, което клиентът също обработва). PL/SQL не е интерактивен език и не трябва да бъркате функционалността на клиента (напр. заместващи променливи) с функционалността на SQL или PL/SQL.
Само за забавление можете да генерирате скрипт, базиран на counter
който прави подходящия брой подкани за идентификатори и имена и ги въвежда във формат, който може да се използва от просто вмъкване:
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;
Това създава файл, наречен prompter.sql
(Поставих го в /tmp; поставете го някъде подходящо за вашата среда!); с подканата „брой двойки стойности“ отговори като 2, че временният скрипт би изглеждал да съдържа:
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'"
След това този временен скрипт се изпълнява с @
, подканвайки на потребителя за всички тези индивидуални стойности. И след това колекциите на таблици, изградени от комбинираните заместващи променливи, се използват в избор, който се използва от вмъкването.