Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

पीएल/एसक्यूएल में लूप का उपयोग करके आप एक ही क्वेरी को कई बार कैसे चला सकते हैं?

प्रतिस्थापन चर &counter , &id और &name प्रत्येक का मूल्यांकन एक बार किया जाता है, जब PL/SQL ब्लॉक संकलित किया जाता है - नहीं जैसा कि इसे क्रियान्वित किया जा रहा है।

पीएल/एसक्यूएल ब्लॉक के भीतर वेरिएबल्स का पुनर्मूल्यांकन या पुन:प्रचार नहीं किया जा सकता है और न ही किया जा सकता है। ब्लॉक को डेटाबेस के भीतर एक इकाई के रूप में निष्पादित किया जाता है - एक बार इसे निष्पादन के लिए सबमिट करने के बाद यह क्लाइंट से स्वतंत्र होता है, जो इसके पूरा होने की प्रतीक्षा करता है (जब तक कि आप इसे बाधित नहीं करते, जिसे क्लाइंट भी संभालता है)। PL/SQL एक संवादात्मक भाषा नहीं है, और आपको क्लाइंट कार्यक्षमता (उदा. प्रतिस्थापन चर) को SQL या PL/SQL कार्यक्षमता के साथ भ्रमित नहीं करना चाहिए।

केवल मनोरंजन के लिए, आप counter . के आधार पर एक स्क्रिप्ट तैयार कर सकते हैं जो आईडी और नामों के लिए उचित संख्या में संकेत देता है, और उन्हें एक ऐसे प्रारूप में लाता है जिसका उपयोग एक साधारण इंसर्ट द्वारा किया जा सकता है:

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;

यह prompter.sql नामक फ़ाइल बनाता है (मैंने इसे /tmp में रखा है; इसे आपके पर्यावरण के लिए उपयुक्त जगह पर रखें!); 'वैल्यू पेयर की संख्या' प्रॉम्प्ट के साथ 2 के रूप में उत्तर दिया गया कि अस्थायी स्क्रिप्ट में शामिल होगा:

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

फिर उस अस्थायी स्क्रिप्ट को @ . के साथ चलाया जाता है , उपयोगकर्ता को उन सभी व्यक्तिगत मूल्यों के लिए प्रेरित करता है। और फिर संयुक्त प्रतिस्थापन चर से निर्मित तालिका संग्रह एक चयन में उपयोग किए जाते हैं, जिसका उपयोग सम्मिलन द्वारा किया जाता है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ओरेकल में बेस 64 एन्कोडिंग और डिकोडिंग

  2. एक रिपोर्ट में बारकोड \ या कई बारकोड के साथ कई रिपोर्ट कैसे प्रिंट करें

  3. Oracle का डिफ़ॉल्ट दिनांक स्वरूप YYYY-MM-DD है, क्यों?

  4. यह त्रुटि है ORA-12154:TNS:निर्दिष्ट कनेक्ट पहचानकर्ता को हल नहीं कर सका?

  5. Oracle डेटाबेस में जुड़े हुए उपयोगकर्ताओं को छोड़ना