PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

क्या मैं त्रुटि पर निरंतरता के लिए बाध्य करने के लिए फॉर लूप में अपवादों का उपयोग कर सकता हूं?

हाँ। आप पेलोड को अपवाद हैंडलिंग के साथ एक अलग कोड ब्लॉक में रख सकते हैं:

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;

मैनुअल में एक उदाहरण है।

लेकिन मैं यह देखने में असफल रहा कि आप tl2 . क्यों असाइन करते हैं पहले (tl1 . के बजाय ), जो लूप के पहले पुनरावृत्ति पर अपवाद पैदा करने के लिए बाध्य है। आप एक FOR लूप और एक स्पष्ट कर्सर के बजाय एक उन्नत क्वेरी के संयोजन में। नीचे देखें।

साथ ही, आपका UPDATE कोई WHERE नहीं है हालत, जो लगभग निश्चित रूप से गलत है।

और फ़ंक्शन pgr_trsp() कम से कम कहने के लिए संदिग्ध लग रहा है। एसक्यूएल इंजेक्शन के टेक्स्ट रीक के रूप में कोड पास करना। dba.SE पर इस संबंधित उत्तर में plpgsql में SQLi का मूल्यांकन है:
फ़ंक्शन बनाम तैयार क्वेरी पोस्ट करता है

अद्यतन प्रश्न में ऑडिटेड फ़ंक्शन

लूपिंग के बजाय सेट-आधारित तर्क का उपयोग करने के लिए अपने कोड को फिर से लिखना क्लीनर और तेज़ हो सकता है। स्टार्टर के लिए, आप कुछ इस तरह से सरल बना सकते हैं (अभी भी एक लूप के साथ, लेकिन सरलीकृत):

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;

विशेष रूप से,...

. का उपयोग करते हुए

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL में पुनरावर्ती ट्रिगर रोकें

  2. मैं एक विदेशी कुंजी तालिका को दो बार कैसे संदर्भित करूं?

  3. पोस्टग्रेस्क्ल विदेशी कुंजी सिंटैक्स

  4. क्यों pg_restore सफलतापूर्वक लौट रहा है लेकिन वास्तव में मेरे डेटाबेस को पुनर्स्थापित नहीं कर रहा है?

  5. पोस्टग्रेज़ नई पंक्ति का संदर्भ देने वाली पंक्ति के लिए NULL मान फ़ंक्शन करता है