sql >> Databáze >  >> RDS >> Oracle

Jak můžete spustit stejný dotaz vícekrát pomocí smyčky v PL/SQL?

Substituční proměnné &counter , &id a &name jsou každý vyhodnocen jednou, když je zkompilován PL/SQL blok - ne jak se provádí.

Proměnné nejsou a nemohou být přehodnocovány nebo propagovány v rámci bloku PL/SQL. Blok je v databázi spuštěn jako jeden celek - jakmile je odeslán k provedení, je nezávislý na klientovi, který jen čeká na dokončení (pokud jej nepřerušíte, což klient také zpracovává). PL/SQL není interaktivní jazyk a neměli byste si plést klientské funkce (např. substituční proměnné) s funkcemi SQL nebo PL/SQL.

Jen pro zábavu můžete vygenerovat skript založený na counter který provede příslušný počet dotazů na ID a jména a převede je do formátu, který lze použít jednoduchým vložením:

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;

Tím se vytvoří soubor s názvem prompter.sql (Vložil jsem to do /tmp; dejte to někam, kde je to vhodné pro vaše prostředí!); s výzvou 'počet párů hodnot' odpověděla jako 2, že dočasný skript bude vypadat obsahovat:

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

Tento dočasný skript se pak spustí pomocí @ , která uživatele vyzve k zadání všech těchto jednotlivých hodnot. A pak jsou kolekce tabulek sestavené z kombinovaných substitučních proměnných použity ve výběru, který používá insert.




  1. SCD typ 6

  2. Duplikování řádků na základě hodnoty sloupce v každém řádku

  3. Jak nastavit automatické převzetí služeb při selhání pro databázi Moodle MySQL

  4. Oracle SQL - REGEXP_LIKE obsahuje jiné znaky než a-z nebo A-Z