Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Bagaimana Anda bisa menjalankan kueri yang sama beberapa kali menggunakan loop di PL/SQL?

Variabel substitusi &counter , &id dan &name masing-masing dievaluasi sekali, ketika blok PL/SQL dikompilasi - tidak saat sedang dieksekusi.

Variabel tidak, dan tidak dapat, dievaluasi ulang atau dipromosikan kembali dalam blok PL/SQL. Blok dieksekusi sebagai satu unit dalam database - setelah dikirimkan untuk dieksekusi, blok tersebut tidak tergantung pada klien, yang hanya menunggu hingga selesai (kecuali jika Anda menginterupsinya, yang juga ditangani oleh klien). PL/SQL bukan bahasa interaktif, dan Anda tidak boleh mengacaukan fungsionalitas klien (misalnya variabel substitusi) dengan fungsionalitas SQL atau PL/SQL.

Hanya untuk bersenang-senang, Anda dapat membuat skrip berdasarkan counter yang melakukan jumlah permintaan yang sesuai untuk ID dan nama, dan memasukkannya ke dalam format yang dapat digunakan dengan penyisipan sederhana:

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;

Itu membuat file bernama prompter.sql (Saya telah meletakkannya di /tmp; taruh di tempat yang cocok untuk lingkungan Anda!); dengan prompt 'jumlah pasangan nilai' dijawab sebagai 2 skrip sementara akan terlihat berisi:

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

Skrip sementara itu kemudian dijalankan dengan @ , yang meminta pengguna untuk memasukkan semua nilai individual tersebut. Dan kemudian koleksi tabel yang dibangun dari variabel substitusi gabungan digunakan dalam pilih, yang digunakan oleh sisipan.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Manajer Perusahaan Kontrol FMW 11g di R12.2

  2. Bagaimana cara meneruskan nilai ke operator IN secara dinamis?

  3. Apa itu Oracle Joins (Sql Joins)?

  4. PL/SQL - Gunakan Variabel Daftar di Mana Dalam Klausa

  5. Apakah kebuntuan mungkin terjadi saat memperbarui dan menghapus baris yang berbeda dalam sebuah tabel?