Нужен блок PL / SQL для получения данных в соответствии с моим требованием - PullRequest
0 голосов
/ 02 мая 2018

У меня за столом 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 при выводе. Просьба предложить.

Ниже приведен альтернативный оператор выбора для того же. Но я не хочу использовать подзапрос. Bcoz в Prod У меня есть одна тяжелая таблица, где я хочу применить ту же логику. Так что нужно идти с курсором.

select ID,Name,AGE from abc where age in (
SELECT age FROM ABC
GROUP BY AGE
HAVING COUNT(1)>1);

1 Ответ

0 голосов
/ 02 мая 2018

Но я не хочу использовать подзапрос. Bcoz в Prod у меня есть один тяжелый стол где я хочу применить ту же логику. Так что нужно идти с курсором.

Почему вы предполагаете, что цикл через CURSOR для отображения в блоке PL / SQL эффективнее, чем простой оператор выбора?

Я мог бы дать вам этот запрос в качестве другой альтернативы вашему подзапросу, используя аналитическую функцию 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 или одиночный open cursor с выбором будет достаточно для отображения вывода или передачи CURSOR во внешнее приложение или

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...