这是我第一次尝试编写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中这样做。感谢您的帮助:)
答案 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>