繁体   English   中英

如何在一个PL/SQL语句中编写多个SQL查询语句和PL/SQL语句

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

在 1 个 PL/SQL 块中必须使用多个SELECT查询和一个块语句。 在这个块语句中,我们必须在insert查询之前进行计数,一旦insert语句运行,则必须在下面提到的 id 值的 after_counts 之后进行计数。

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和由于id而在insert语句中出现错误。 我想要 csv 格式或输出格式的输出,例如应该生成 3 列作为 id、before_counts、after_counts 及其正确值。 像这样:-

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

像这样的东西:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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