2016-01-14 2 views
1

Используя этот код, я не могу запускать запрос вставки несколько раз; он запрашивает идентификатор и имя только один раз (если значение в счетчике меньше 1).Как выполнить один и тот же запрос несколько раз, используя цикл в PL/SQL?

declare 
     counter number := 0 ; 
begin 
     counter := &counter ; 
     while counter > 0 loop 
       insert into customer values (&id, '&name') ; 
       counter := counter - 1 ; 
     end loop ; 
end ; 

Позвольте мне объяснить с помощью примера: -

Скажем, я поставил значение 2 в counter. При этом он должен дважды запрашивать идентификатор и имя, но он запрашивает только один раз, и он дважды копирует значения, которые я вводил для ID и имени в таблицу test.

Как это исправить? Если я не могу, то предложите альтернативный код, который исправит мою проблему.

+0

Можете ли вы показать весь свой код из декларации? – sagi

+0

Возможно, вам захочется просмотреть эту информацию для альтернативных методов получения пользовательского ввода: https://www.safaribooksonline.com/library/view/oracle-sqlplus-the/1565925785/ch04s03.html. Кроме того, я предполагаю, что вы используете SQL/Plus. Вы должны соответствующим образом пометить свой вопрос. –

ответ

4

подстановки переменных &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, который используется вставкой.

+0

так нет выхода из этого ?? – Ahtisham

+0

@AhtishamChishti - не простой способ. Это упражнение или что-то, что вам действительно нужно делать с интерактивными подсказками? –

+0

Я просто хочу вставить значения в таблицу в соответствии с пользователем и хочу реализовать реляционную алгебру на них, я знаю, что могу это сделать, не используя pl/sql, но тогда я должен спросить пользователя для каждой строки btw, вы на Facebook, если да, то пожалуйста пришлите мне свой идентификатор, чтобы я мог проконсультироваться с вами для получения дополнительных вопросов? – Ahtisham

Смежные вопросы