PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tôi có thể sử dụng EXCEPTIONs trong FOR LOOP để buộc tiếp tục khi bị lỗi không?

Đú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 ...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. psycopg2.ProgrammingError on Enum type in Flask (database) di chuyển cơ sở dữ liệu

  2. Cách tăng giá trị trong câu lệnh cập nhật postgres trên khóa JSON

  3. Bảng dưới dạng đối số của một hàm PostgreSQL

  4. java.io.IOException:Chuỗi UTF-8 bất hợp pháp:byte ban đầu là 11111xxx:252 - Eclipse và PostgreSQL

  5. Hiệu suất kém trên một truy vấn PostgreSQL