1 PL/SQL ब्लॉक में एकाधिक SELECT क्वेरी और एक ब्लॉक स्टेटमेंट का उपयोग करना होता है। इस ब्लॉक स्टेटमेंट में हमें insert क्वेरी से पहले काउंट लेना होता है और एक बार insert स्टेटमेंट रन हो जाने के बाद उसके बाद नीचे बताए गए आईडी वैल्यू के आफ्टर_काउंट्स लेने होते हैं।

set heading off
set colsep '|'
set feedback off
set sqlformat csv
set trimspool on
spool output.txt
declare
 ln_rec tab1%rowtype;
 lv varchar(20);
 sid tab.id%type;
 b_cnts number;
 a_cnts number;
 type sh_id is varray(10) of tab.col1%type;
 id sh_id := sh_id(1, 3, 5, 7, 9, 11, 13, 15, 17, 19);
begin
 select a.id, count(b.sub_id) into sid, b_cnts as "before_counts" from tab a, tab1 b;

 for i in (select distinct b.sub_id from tab a, tab1 b where a.id in (1, 3, 5, 7, 9, 11, 13, 15, 17, 19))
 loop
  select * into ln_rec from tab1 where sub_id = i.sub_id;

  insert into new_tab values(id, i.sub_id, lv);
  commit;
 end loop;

 select a.id, count(b.sub_id) into sid, a_cnts as "after_counts" from tab a, tab b;
end;
spool off

लेकिन जब मैं इसे निष्पादित करता हूं तो उपरोक्त SET system variable summary और insert कथन id के कारण त्रुटि हुई। मैं सीएसवी प्रारूप या आउटपुट प्रारूप में आउटपुट चाहता हूं जैसे कि आईडी के रूप में 3 कॉलम जेनरेट किए जाने चाहिए, पहले_काउंट्स, आफ्टर_काउंट्स और इसके उचित मूल्य। इस कदर:-

<id>   <before_counts>    <after_counts>   -- This heading should not appear because above used heading off
1       135                138
3       246                250
5       298                302
7       389                399
.........
0
User Rock 9 पद 2019, 12:33

1 उत्तर

सबसे बढ़िया उत्तर

कुछ इस तरह:

DECLARE
 type sh_id is varray(10) of tab.col1%type;

 a_cnts number;
 b_cnts number;
 lv     varchar2(20) := NULL; -- This is never modified in your code.
 ids    sh_id := sh_id(1, 3, 5, 7, 9, 11, 13, 15, 17, 19);
BEGIN
  FOR i IN 1 .. ids.COUNT LOOP
    SELECT count(b.sub_id)
    INTO   b_cnts
    FROM   tab a
           INNER JOIN tab1 b
           ON ( <some join conditions> ) -- you need to specify the join
    WHERE  a.id = ids(i);

    INSERT INTO new_tab
    SELECT DISTINCT
           ids(i),
           b.sub_id,
           lv
    FROM   tab a
           INNER JOIN tab1 b
           ON ( <some join conditions> ) -- you need to specify the join
    WHERE  a.id = ids(i);

    -- Assuming you have a trigger to populate tab or tab1 from new_tab then
    a_cnts := b_cnts + SQL%ROWCOUNT;

    -- Otherwise:
    SELECT count(b.sub_id)
    INTO   a_cnts
    FROM   tab a
           INNER JOIN tab1 b
           ON ( <some join conditions> ) -- you need to specify the join
    WHERE  a.id = ids(i);

    DBMS_OUTPUT.PUT_LINE( ids(i) || CHR(9) || b_cnts || CHR(9) || a_cnts );
  END LOOP;

  -- Commit outside the loop
  COMMIT;
END;
/
0
MT0 9 पद 2019, 13:22