sql >> Database teknologi >  >> RDS >> Oracle

Hvordan kan du køre den samme forespørgsel flere gange ved hjælp af loop i PL/SQL?

Substitutionsvariablerne &counter , &id og &name evalueres hver én gang, når PL/SQL-blokken er kompileret - ikke som den udføres.

Variablerne er ikke, og kan ikke re-evalueres eller re-promoveres inden for PL/SQL-blokken. Blokken udføres som en enkelt enhed i databasen - når den først er sendt til eksekvering er den uafhængig af klienten, som bare venter på at den er færdig (medmindre du afbryder den, hvilket klienten også håndterer). PL/SQL er ikke et interaktivt sprog, og du bør ikke forveksle klientfunktionalitet (f.eks. substitutionsvariabler) med SQL- eller PL/SQL-funktionalitet.

For sjov kan du generere et script baseret på counter som udfører det passende antal prompter for ID'er og navne, og får dem til et format, der kunne bruges af en simpel indsættelse:

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;

Det opretter en fil kaldet prompter.sql (Jeg har lagt det i /tmp; sæt det et sted, der passer til dit miljø!); med 'antal værdipar'-prompten svaret som 2, som det midlertidige script ville se ud, indeholder:

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'"

Det midlertidige script køres derefter med @ , der beder brugeren om alle disse individuelle værdier. Og så bruges tabelsamlinger bygget ud fra de kombinerede substitutionsvariabler i et udvalg, som bruges af indsættelsen.




  1. Hvordan indsætter man en fil i Oracle-databasen?

  2. Sådan gemmer du JSON-data i MySQL

  3. Kald en sæt-returnerende funktion med et array-argument flere gange

  4. Sender param til DB .execute for WHERE IN... INT-listen