2014-10-13 2 views
6

कार्यकारी सारांश: PostgreSQL अद्भुत है, लेकिन हम इस तथ्य है कि यह क्रम तक PL/pgSQL कोड पर कई चेकों स्थगित की वजह से काम पर कई मुद्दों का सामना कर रहे । क्या इस संबंध में ओरेकल के पीएल/एसक्यूएल की तरह इसे बनाने का कोई तरीका है?PostgreSQL बनाम ओरेकल: "संकलन-टाइम" पी एल की जाँच/pgSQL

उदाहरण के लिए ...

किसी भी Oracle DB में इस को क्रियान्वित करने का प्रयास करें:

create function foo return number as 
begin 
    select a from dual; 
    return a; 
end; 

ओरेकल तुरंत (यानी संकलन समय पर!) जवाब देंगे साथ:

[Error] ORA-00904: invalid identifier 

अब PostgreSQL में अर्थात् समकक्ष चीज़ों को आजमाएं:

CREATE OR REPLACE FUNCTION public.foo() 
    RETURNS integer AS 
$body$ 
    BEGIN 
     select a; 
     return a; 
    END; 
$body$ 
LANGUAGE plpgsql; 

आप इसे देखेंगे - दुर्भाग्य से! - ठीक निष्पादित करें ... कोई त्रुटि रिपोर्ट नहीं की गई है।

लेकिन जब आप तो इस फ़ंक्शन को कॉल करने का प्रयास करें (यानी क्रम में) आप मिल जाएगा:

ERROR: column "a" does not exist 
LINE 1: select a 

वहाँ वाक्य रचना विश्लेषण करने के लिए PostgreSQL मजबूर करने के लिए एक रास्ता है और समारोह परिभाषा समय में जाँच - नहीं चलने के समय पर? हमारे पास काम पर विरासत पीएल/एसक्यूएल कोड है, जिसे हम PostgreSQL पर पोर्ट कर रहे हैं - लेकिन संकलन-समय चेक की कमी बहुत दर्दनाक है, हमें मैन्युअल काम करने के लिए मजबूर करना - यानी सभी कोड पथों का परीक्षण करने के लिए कोड लिखना कार्य/प्रक्रियाएं - जो ओरेकल में अन्यथा स्वचालित थीं।

उत्तर

7

हां, यह एक ज्ञात मुद्दा है।

पीएल/पीजीएसक्यूएल (SQL को छोड़कर किसी अन्य समारोह की तरह) PostgreSQL के लिए एक "ब्लैक बॉक्स" है, इसलिए रनटाइम को छोड़कर त्रुटियों का पता लगाना वास्तव में संभव नहीं है।

आप कई बातें कर सकते हैं:

  1. क्रम त्रुटियों पर बेहतर नियंत्रण के लिए BEGIN/COMMIT बयान में अपने समारोह SQL प्रश्नों बुला लपेट;
  2. त्रुटियों को पकड़ने और ट्रैक करने के लिए अपने कोड में EXCEPTION blocks जोड़ें। नोट, हालांकि, यह फ़ंक्शन प्रदर्शन को प्रभावित करेगा;
  3. पावेल स्टीहुले द्वारा विकसित plpgsql_check extension का उपयोग करें, जो पीएल/पीजीएसक्यूएल विकास के मुख्य योगदानकर्ताओं में से एक है। मुझे लगता है कि आखिरकार यह एक्सटेंशन इसे PostgreSQL के मूल में बना देगा, लेकिन इसमें कुछ समय लगेगा (अब हम 9.4 बीटा 3 राज्य में हैं);
  4. इस संबंधित सवाल पर गौर कर सकता है: postgresql syntax check without running the query

और यह वास्तव में लगता है कि आप एक इकाई परीक्षण ढांचे की एक बड़ी जरूरत में कर रहे हैं।

+2

परीक्षण के विषय पर, मैं मूल पोस्टर हेड तुरंत http://pgtap.org/ पर सुझाव दूंगा और अपना जीवन * अधिक * आसान बना दूंगा। –

4

Plpgsql भाषा संकलन समय में बिना अर्थशास्त्र जांच के डिजाइन किए गए हैं। मुझे यकीन नहीं है कि यह सुविधा पुराने plpgsql कार्यान्वयन का इरादा या दुष्प्रभाव था, लेकिन समय में हमें कुछ फायदे मिले (लेकिन आपके द्वारा नुकसान का उल्लेख किया गया)।

प्लस:

  • वहाँ कार्य करता है और अन्य डेटाबेस वस्तुओं के बीच निर्भरता के साथ कम मुद्दे हैं। यह चक्रीय निर्भरता का सरल समाधान है। Plpgsql कार्यों की तैनाती सरल है, क्योंकि आपको निर्भरता का सम्मान करने की आवश्यकता नहीं है।
  • अस्थायी तालिकाओं वाले कुछ पैटर्न आलसी निर्भरता के कारण संभव हैं। यह आवश्यक है, क्योंकि पोस्टग्रेस वैश्विक अस्थायी तालिकाओं का समर्थन नहीं करता है।

उदाहरण:

BEGIN 
    CREATE TEMP TABLE xx(a int); 
    INSERT INTO xx VALUES(10); -- isn't possible with compile time dependency 
END; 

माइनस:

  • हालांकि यह कभी कभी संभव है वहाँ, कोई संभव एक संकलन समय गहरी जाँच (पहचानकर्ता जाँच) कर रहे हैं। - यह आधार है क्योंकि कुछ स्थिति स्थिर नहीं जांचा जा सकता - उदाहरण के लिए गतिशील एसक्यूएल

    • वापसी और इकाई परीक्षण:
    कुछ बड़ा परियोजनाओं समाधान का मिश्रण इस्तेमाल किया जाना चाहिए के लिए

  • plpgsql_check - यह बाहरी है, लेकिन समर्थित परियोजना कुछ बड़ी कंपनियों और बड़े plpgsql उपयोगकर्ताओं का उपयोग करती है। यह एसक्यूएल पहचानकर्ता वैधता की स्थिर जांच को लागू कर सकता है। आप डीडीएल ट्रिगर्स द्वारा इस चेक को लागू कर सकते हैं।
संबंधित मुद्दे