Đúng. Bạn có thể đặt trọng tải trong một khối mã riêng biệt với xử lý ngoại lệ:
FOR temp_rec IN tlcursor LOOP
tl2 := temp_rec; --the location to be updated
--Do the Routing and UPDATE the taxilocs row.
BEGIN
UPDATE taxilocs20120113
SET route = pgr_trsp (
'SELECT * FROM th_2po_4pgr',
tl1.map_id, tl1.map_pos, tl2.map_id, tl2.map_pos, false, true);
EXCEPTION WHEN OTHERS THEN
-- keep looping
END;
tl1 := tl2;
END LOOP;
Có một ví dụ trong sách hướng dẫn .
Nhưng tôi không hiểu tại sao bạn chỉ định tl2
đầu tiên (thay vì tl1
), được ràng buộc để gây ra một ngoại lệ ở lần lặp đầu tiên của vòng lặp. Bạn có thể tránh sự cố trước bằng cách sử dụng FOR
vòng lặp
và thay vì một con trỏ rõ ràng kết hợp với một truy vấn nâng cao. Xem bên dưới.
Ngoài ra, UPDATE
của bạn không có WHERE
điều kiện, gần như chắc chắn là sai.
Và hàm pgr_trsp()
có vẻ đáng ngờ để nói rằng ít nhất. Truyền mã dưới dạng tuần văn bản của SQL injection. Câu trả lời liên quan này trên dba.SE có đánh giá về SQLi trong plpgsql:
Hàm Postgres so với các truy vấn chuẩn bị
Chức năng được kiểm tra trong câu hỏi đã cập nhật
Viết lại mã của bạn để sử dụng logic dựa trên bộ thay vì lặp lại có thể rõ ràng hơn và nhanh hơn.
CREATE OR REPLACE FUNCTION fm_seqrouting()
RETURNS integer AS
$func$
DECLARE
r record;
BEGIN
FOR r IN
SELECT oid -- no proper pk?
,th_2po_4pgr_id AS map_id1
,th_2po_4pgr_position AS map_pos1
,lead(th_2po_4pgr_id) OVER w AS map_id2
,lead(th_2po_4pgr_position) OVER w AS map_pos2
,count(*) OVER () AS ct
FROM testlocs
WINDOW w AS (ORDER BY veh_id, dt)
ORDER BY veh_id, dt -- you don't need order by columns in result
LOOP
BEGIN -- may be unnecessary
UPDATE taxilocs20120113
SET "pgRoute" = pgr_trsp(
'SELECT * FROM th_2po_4pgr'
,r.last_map_id, r.last_map_pos, r.map_id, r.map_pos, false, true)
WHERE taxilocs20120113.oid = r.oid;
EXCEPTION
WHEN SQLSTATE '55000' THEN NULL;
WHEN SQLSTATE 'XX000' THEN NULL;
WHEN SQLSTATE '38001' THEN NULL;
END;
END LOOP;
RETURN r.ct;
END
$func$ LANGUAGE plpgsql;
Đặc biệt, sử dụng ...
- Một
FOR
vòng lặp với con trỏ ngầm thay vì một con trỏ rõ ràng (khó sử dụng). - Chức năng cửa sổ.