Oracle
 sql >> база данни >  >> RDS >> Oracle

Как можете да изпълнявате една и съща заявка няколко пъти, като използвате цикъл в PL/SQL?

Променливите за заместване &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'"

След това този временен скрипт се изпълнява с @ , подканвайки на потребителя за всички тези индивидуални стойности. И след това колекциите на таблици, изградени от комбинираните заместващи променливи, се използват в избор, който се използва от вмъкването.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. как да обединя повече от две колони в plsql developer?

  2. Каква е разликата между хеш присъединяване и обединяване с обединяване (Oracle RDBMS)?

  3. Oracle:Как да разбера дали има чакаща транзакция?

  4. Принудително намаляване на глобалната таблица на Oracle

  5. Как да реша ORA-28000 акаунтът е заключен