Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Làm thế nào bạn có thể chạy cùng một truy vấn nhiều lần bằng cách sử dụng vòng lặp trong PL / SQL?

Các biến thay thế &counter , &id&name mỗi khối được đánh giá một lần khi khối PL / SQL được biên dịch - không vì nó đang được thực thi.

Các biến không, và không thể được đánh giá lại hoặc thăng cấp lại trong khối PL / SQL. Khối được thực thi như một đơn vị duy nhất trong cơ sở dữ liệu - khi nó đã được gửi để thực thi, nó sẽ độc lập với máy khách, chỉ đợi nó hoàn thành (trừ khi bạn làm gián đoạn nó, mà máy khách cũng xử lý). PL / SQL không phải là một ngôn ngữ tương tác và bạn không nên nhầm lẫn chức năng máy khách (ví dụ:biến thay thế) với chức năng SQL hoặc PL / SQL.

Vui thôi, bạn có thể tạo tập lệnh dựa trên counter mà số lượng lời nhắc thích hợp cho ID và tên, và đưa chúng vào một định dạng có thể được sử dụng bởi một chèn đơn giản:

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;

Điều đó tạo ra một tệp có tên là prompter.sql (Tôi đã đặt nó vào / tmp; hãy đặt nó ở đâu đó phù hợp với môi trường của bạn!); với lời nhắc 'số cặp giá trị' được trả lời là 2 mà tập lệnh tạm thời trông sẽ chứa:

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

Tập lệnh tạm thời đó sau đó được chạy với @ , nhắc người dùng về tất cả các giá trị riêng lẻ đó. Và sau đó tập hợp bảng được xây dựng từ các biến thay thế kết hợp được sử dụng trong một lựa chọn, được sử dụng bởi chèn.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Quản lý cửa sổ trong Oracle D2k Forms

  2. .NET / Oracle:Cách thực thi một tập lệnh với các câu lệnh DDL theo chương trình

  3. Oracle:Chọn từ kiểu dữ liệu bản ghi

  4. Cách tạo VARRAY làm đối tượng cơ sở dữ liệu trong cơ sở dữ liệu Oracle

  5. Xem xét từng lỗi từng nhóm của Oracle