无法将DBMS_OUTPUT.PUT_LINE与批量收集到一起使用

时间:2019-01-01 19:42:40

标签: sql oracle plsql bulkinsert

这是我第一次尝试编写PL / SQL。

我有一个包含多列的表T_TRANSACTION。我希望我的PL / SQL首先提取称为mandant的某些列的不同值并将其保存到游标。然后我想编写一个for循环,其中对于主查询中的每个mandant游标,我都会做一些事情。

主要查询是一个基本选择,显然在PL / SQL中不起作用,这就是为什么我使用select into的原因,因为它返回的行多于1行,因此我不得不使用BULK collect into。我现在有一个准备就绪的pl / sql,在技术上可以正常使用,但是我无法输出结果(无法正确使用DBMS_OUTPUT.PUT_LINE),因此我不知道这是否正确。这是PL / SQL:

declare 
    cursor c1 is
        SELECT distinct mandant  from T_TRANSACTION;
        type mytab is table of VARCHAR2(20);
        colname mytab := mytab();
        colval mytab := mytab();
        colcount mytab := mytab();

BEGIN

     for i in c1
     loop
                select 'PARTNER_ID' as column_name, to_char(col), cnt bulk collect into colname, colval, colcount
                from (select PARTNER_ID as col, count(*) as cnt
                            from T_TRANSACTION
                            where SML like '181031%A' and mandant = i.mandant
                            group by PARTNER_ID 
                            order by count(*)desc) 
                 where rownum <=3
                 connect by level <=3;

    end loop;

    -- DBMS_OUTPUT.PUT_LINE (colname || colval || colcount);
end; 

这是我的表T_TRANSACTION

   CREATE TABLE T_TRANSACTION 
   (    MANDANT CHAR(5 CHAR), 
    SML VARCHAR2(15 BYTE), 
    RUN CHAR(1 CHAR), 
    SL_PARTNER_RISK VARCHAR2(20 BYTE), 
    GESCHAEFT_ID VARCHAR2(20 BYTE), 
    PARTNER_ID VARCHAR2(20 BYTE), 
    TRANS_ID VARCHAR2(20 BYTE);  

在下面的查询中,我从光标中获取每个PARTNER_ID的列mandant的前3个值。

我的第二个问题实际上是如何在不重复查询的情况下对表的所有列执行此操作。稍后,我想将其用于许多不同的表,因此我想从all_tab_columns中提取每个表的列,然后运行为每个表的所有列发布的查询。但是我不知道如何在PL / SQL中这样做。感谢您的帮助:)

1 个答案:

答案 0 :(得分:1)

获取数据后,您必须使用另一个循环(从 first last 元素)(在我的示例中为10-12行),然后显示这些循环值。

基于斯科特的模式,看看这个例子:

SQL> set serveroutput on;
SQL> declare
  2    t_deptno sys.odcinumberlist;
  3    t_dname  sys.odcivarchar2list;
  4    cursor cur_r is select deptno, dname from dept;
  5  begin
  6    open cur_r;
  7    fetch cur_r bulk collect into t_deptno, t_dname;
  8    close cur_r;
  9
 10    for i in t_deptno.first .. t_deptno.last loop
 11      dbms_output.put_line(t_deptno(i) ||' '|| t_dname(i));
 12    end loop;
 13  end;
 14  /
10 ACCOUNTING
20 RESEARCH
30 SALES
40 OPERATIONS

PL/SQL procedure successfully completed.

SQL>