sql >> Databasteknik >  >> RDS >> Oracle

Hur kan du köra samma fråga flera gånger med loop i PL/SQL?

Substitutionsvariablerna &counter , &id och &name utvärderas var och en en gång när PL/SQL-blocket kompileras - inte när den exekveras.

Variablerna är inte, och kan inte, omvärderas eller repromoveras inom PL/SQL-blocket. Blocket exekveras som en enda enhet i databasen - när det väl har skickats in för exekvering är det oberoende av klienten, som bara väntar på att det ska slutföras (om du inte avbryter det, vilket klienten också hanterar). PL/SQL är inte ett interaktivt språk, och du bör inte blanda ihop klientfunktionalitet (t.ex. substitutionsvariabler) med SQL- eller PL/SQL-funktionalitet.

Bara för skojs skull kan du skapa ett skript baserat på counter som gör lämpligt antal uppmaningar om ID:n och namn, och får dem till ett format som kan användas med en enkel infogning:

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 skapar en fil som heter prompter.sql (Jag har lagt det i /tmp; placera det någonstans som passar din miljö!); med prompten 'antal värdepar' svarade som 2 som det tillfälliga skriptet skulle se ut innehåller:

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 temporära skriptet körs sedan med @ , och uppmanar användaren att ange alla dessa individuella värden. Och sedan används tabellsamlingar byggda från de kombinerade substitutionsvariablerna i ett urval, som används av infogningen.




  1. Hur man modellerar för enkelt databasunderhåll

  2. Det korrekta sättet att implementera en unik begränsning som tillåter flera NULL-värden i SQL Server

  3. Hur kan jag logga och hitta de dyraste frågorna?

  4. Vad betyder teckenuppsättning och sortering exakt?