подстановки переменных &counter
, &id
и &name
каждый вычисляется один раз, когда/SQL-блок PL компилируется - не, как это выполняется.
Эти переменные не могут быть переоценены или повторно подвергнуты повторной оценке в блоке 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'"
Это временный сценарий затем запускается с @
, запрашивая пользователь для всех этих отдельных значений. И тогда коллекции таблиц, созданные из комбинированных переменных замещения, используются в select, который используется вставкой.
Можете ли вы показать весь свой код из декларации? – sagi
Возможно, вам захочется просмотреть эту информацию для альтернативных методов получения пользовательского ввода: https://www.safaribooksonline.com/library/view/oracle-sqlplus-the/1565925785/ch04s03.html. Кроме того, я предполагаю, что вы используете SQL/Plus. Вы должны соответствующим образом пометить свой вопрос. –