我有一张桌子ABC。在此表中,基于AGE,我需要查找重复项,对于那些重复记录,我需要在dbms_output.put_line
中选择一些列。
DECLARE
CURSOR C_AGE IS
SELECT AGE FROM ABC
GROUP BY AGE
HAVING COUNT(1)>1 ;
BEGIN
FOR RECS IN C_AGE
LOOP
DBMS_OUTPUT.PUT_LINE (recs.age);
END LOOP;
end;
在上面的代码中,我不需要显示AGE,而是需要输出中的ID,Name,AGE列。 请建议。
下面是相同的替代选择语句。但我不想使用子查询。在Prod的Bcoz我有一张沉重的桌子,我想要应用相同的逻辑。 所以需要使用光标。
select ID,Name,AGE from abc where age in (
SELECT age FROM ABC
GROUP BY AGE
HAVING COUNT(1)>1);
答案 0 :(得分:1)
但我不想使用子查询。在Prod的Bcoz我有一张沉重的桌子 在哪里我想应用相同的逻辑。所以需要使用光标。
为什么假设在PL / SQL块中显示的循环CURSOR
比简单的select语句有效?
我可以使用COUNT
分析函数将此查询作为子查询选择的另一种替代方法。
SELECT ID
,Name
,AGE
FROM (
SELECT a.*
,COUNT(*) OVER (PARTITION BY AGE) AS c
FROM abc a
) where c > 1;
如果您仍想使用循环在PL / SQL中应用相同的逻辑,只有在执行任何DML(INSERT
,UPDATE
等动态DDL等时才执行此操作。否则,纯sql使用select选择或单个open cursor
就足以显示输出或将CURSOR
传递给外部应用程序。