简体   繁体   中英

How to write multiple SQL query statement and PL/SQL statement inside one PL/SQL statement

In 1 PL/SQL block have to use multiple SELECT query and one block statement. In this block statement we have to take counts before insert query and once insert statement run then after have to take its after_counts of the id value that mentioned below.

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

But when i execute it then got error because of above SET system variable summary and in the insert statement due to id . I want output in the csv format or output format like where 3 columns should be generated as id, before_counts, after_counts & its proper value. Like this:-

<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
.........

Something like this:

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;
/

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM