我想从光标到表中提取所选内容,但它提取相同的行(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;
谢谢。