如何使用游标读取多于1行?

时间:2019-05-16 23:44:17

标签: oracle plsql

我想从光标到表中提取所选内容,但它提取相同的行(client_phones,email)。我究竟做错了什么?请帮帮我。光标应该具有什么语法?

这是我的屏幕截图:

This is the result of my query

我喜欢

CURSOR phone_cursor IS
SELECT d.c_info
FROM (
    SELECT cl.name, co.c_info, ROW_NUMBER() OVER (PARTITION BY cl.id ORDER BY co.c_info DESC) rn 
    FROM Clients cl
      JOIN Address ad ON cl.id = ad.client_id
      JOIN Contacts co ON co.client_id = cl.id
    WHERE co.c_type = 1

) d
WHERE rn <= 1
FETCH FIRST 5 ROWS ONLY;

但是没有用

这是我所有的查询代码:

CREATE OR REPLACE PROCEDURE insertaddress
IS
phone varchar2(200);
email varchar2(200);

CURSOR phone_cursor IS
SELECT d.c_info
FROM (
    SELECT cl.name, co.c_info, ROW_NUMBER() OVER (PARTITION BY cl.id ORDER BY co.c_info DESC) rn 
    FROM Clients cl
      JOIN Address ad ON cl.id = ad.client_id
      JOIN Contacts co ON co.client_id = cl.id
    WHERE co.c_type = 1

) d
WHERE rn <= 1
FETCH FIRST 5 ROWS ONLY;



CURSOR email_cursor IS
SELECT d.c_info
FROM (
    SELECT cl.name, co.c_info, ROW_NUMBER() OVER (PARTITION BY cl.id ORDER BY co.c_info ASC) rn 
    FROM Clients cl
      JOIN Address ad ON cl.id = ad.client_id
      JOIN Contacts co ON co.client_id = cl.id
    WHERE co.c_type = 2

) d
WHERE rn <= 1
FETCH FIRST 5 ROWS ONLY;




BEGIN


OPEN phone_cursor;

LOOP
FETCH phone_cursor INTO phone;
EXIT WHEN phone_cursor%NOTFOUND;
END LOOP;
CLOSE phone_cursor;

OPEN email_cursor;
LOOP
FETCH email_cursor INTO email;
EXIT WHEN email_cursor%NOTFOUND;
END LOOP;
CLOSE email_cursor;






INSERT INTO Client_Info(id, client_id, client_name, client_address, client_phones, email)
SELECT DISTINCT t.id, t.client_id, t.name, 'г. ' || t.city || ' ' || 'ул. ' || t.street || ' ' || 'д. ' || t.house || ' ' || 'кв. ' || t.flat AS Address, phone, email
FROM (
    SELECT ad.id, cl.name, ad.city, ad.street,  ad.house, ad.flat, ad.client_id, ad.a_type, ad.created, ad.active,
                DENSE_RANK() OVER (PARTITION BY cl.id
        ORDER BY (CASE WHEN ad.id IS NULL THEN 1 ELSE 0 END) + 
                                         (CASE WHEN ad.client_id IS NULL THEN 1 ELSE 0                    END) + 
                                         (CASE WHEN ad.a_type IS NULL THEN 1 ELSE 0 END)                 +
                                         (CASE WHEN ad.city IS NULL THEN 1 ELSE 0 END) + 
                                         (CASE WHEN ad.street IS NULL THEN 1 ELSE 0 END) + 
                                         (CASE WHEN ad.house IS NULL THEN 1 ELSE 0 END) +
                                          (CASE WHEN ad.flat IS NULL THEN 1 ELSE 0 END) + 
                                         (CASE WHEN ad.created IS NULL THEN 1 ELSE 0 END)                 + 
                                         (CASE WHEN ad.active IS NULL THEN 1 ELSE 0 END)
                               ) AS caselist

      FROM Address ad
      JOIN Clients cl ON cl.id = ad.client_id

      WHERE ad.active = 'Y'
     ) t
WHERE caselist <= 1
ORDER BY t.id ASC; 



COMMIT;
END insertaddress;

谢谢。

0 个答案:

没有答案