sql >> Database teknologi >  >> RDS >> PostgreSQL

Kan jeg bruge UNDTAGELSER i en FOR LOOP for at fremtvinge fortsættelse ved fejl?

Ja. Du kan placere nyttelasten i en separat kodeblok med undtagelseshåndtering:

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;

Der er et eksempel i manualen .

Men jeg kan ikke se, hvorfor du tildeler tl2 først (i stedet for tl1 ), som er bundet til at forårsage en undtagelse ved den første iteration af løkken. Du kan undgå problemet på forhånd ved at bruge en FOR sløjfe og i stedet for en eksplicit markør i kombination med en forbedret forespørgsel. Se nedenfor.

Også din UPDATE har ingen WHERE tilstand, hvilket næsten helt sikkert er forkert.

Og funktionen pgr_trsp() ser mildest talt mistænkeligt ud. At sende kode som tekst oser af SQL-injektion. Dette relaterede svar på dba.SE har en vurdering af SQLi i plpgsql:
Postgres-funktioner kontra forberedte forespørgsler

Revideret funktion i opdateret spørgsmål

At omskrive din kode til at bruge sæt-baseret logik i stedet for looping kan være renere og hurtigere. Til at begynde med kan du simplificere til noget som dette (stadig med en loop, men forenklet):

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;

Især ved at bruge ...



  1. Søg matrix for alle rektangler med givne dimensioner (vælg blokke af sæder)

  2. MySQL og HBase Connectivity

  3. Tjek, om nøglen findes i en JSON med PL/pgSQL?

  4. Værtsnavn ikke bekræftet fejlmeddelelse på SSL-forbindelse i postgresql