2012-04-20 35 views
14

मेरे पास एक SQL कथन है (एक ओरेकल डेटाबेस के लिए) जो वैध होने पर चलाने में लंबा समय लगता है। यदि यह मान्य नहीं है, तो यह तुरंत एक त्रुटि के साथ लौटता है।मैं वास्तविक क्वेरी चलाने के बिना जेडीबीसी कथन के लिए एसक्यूएल सिंटैक्स कैसे देख सकता हूं?

मैं यह देखना चाहता हूं कि वाक्यविन्यास कथन चलाने के बिना वैध है (उदाहरण के लिए जेडीबीसी के माध्यम से), उदाहरण के लिए 'चेक स्टेटमेंट' बटन के पीछे। क्या ऐसा करने का एक विक्रेता-स्वतंत्र तरीका है? प्रीपेरस्टेटमेंट के रूप में क्वेरी को परिभाषित करने का मेरा पहला विचार किसी भी तरह का संकलन या त्रुटि जांच का कारण नहीं लगता है।

+0

शायद इस अन्य प्रश्न के उत्तर आपकी मदद कर सकते हैं: http://stackoverflow.com/questions/141499/any-java- पुस्तकालय-out-there-that- validate -एसक्ल-सिंटैक्स –

उत्तर

11

संभवतः कथन के लिए एक व्याख्या योजना जारी करने से आपको उपयोगी परिणाम मिलेंगे।

एक और सोचा - लेकिन शायद कठिन जोड़ने के लिए क्वेरी संपादित करने के लिए है (और ROWNUM < 1) या कुछ और यह तेजी से

+2

व्याख्या योजना योजना का रास्ता है। यह समान वाक्यविन्यास त्रुटियों को "चल रहा" क्वेरी के रूप में देगा –

+1

बाइंड पैरामीटर से कैसे निपटें? – MRalwasser

+0

सच है, अगर आपके पास अपनी क्वेरी में एक भी पैरामीटर है, तो यह बस काम नहीं करेगा। –

5

यह एक वास्तविक जवाब की तुलना में एक हैक की अधिक है चलाने बनाने के लिए, लेकिन आप एक प्रश्न चला सकते हैं

SELECT (EXISTS (SELECT 1 FROM dual) 
     OR 
     EXISTS (your Query here) 
     ) AS result 
FROM dual 

यह TRUE लौटना चाहिए अगर आपकी क्वेरी मान्य है और अगर यह अमान्य है त्रुटि बढ़ा: कि हमेशा एक पंक्ति और एक कॉलम वापस आ जाएगी।

+3

+1 वैकल्पिक रूप से 'चुनें * से (आप यहां क्वेरी करें) जहां 1 = 0' – gordy

+0

गॉर्डी की टिप्पणी मेरा वोट प्राप्त करती है क्योंकि यह ओरेकल की तुलना में अन्य डीबीएमएस के लिए काम करती है। – AlainD

+0

@ user1938185 हां, 'दोहरी से' केवल ओरेकल और MySQL (और SQLite मुझे लगता है) में काम करता है। अन्य में, एसक्यूएल सर्वर और पोस्टग्रेज झुकाएं, आप 'FROM दोहरी' को पूरी तरह से हटा सकते हैं और यह भी काम करेगा। –

2

आप अपने कथन की जांच के लिए DBMS_SQL.PARSE का उपयोग कर सकते हैं। चेतावनी: यह सिर्फ DML बयान पार्स होगा, लेकिन यह निष्पादित और DDL बयान ऐसे बनाने मेज आदि के रूप में आप एक मूल्य या बूलियन इस तरह एक ब्लॉक लौट सकते हैं और रैप करने के लिए एक संग्रहीत प्रक्रिया बना सकते हैं प्रतिबद्ध होगा:

set serveroutput on 
-- Example of good SQL 
declare 
    c integer; 
    s varchar2(50) := 'select * from dual'; 
begin 
    c := dbms_sql.open_cursor; 
    dbms_sql.parse(c,s,1); 
    dbms_sql.close_cursor(c); 
    dbms_output.put_line('SQL Ok'); 
exception 
    when others then 
    dbms_sql.close_cursor(c); 
    dbms_output.put_line('SQL Not Ok'); 
end; 
/

-- Example of bad SQL 
declare 
    c integer; 
    s varchar2(50) := 'select splat from dual'; 
begin 
    c := dbms_sql.open_cursor; 
    dbms_sql.parse(c,s,1); 
    dbms_sql.close_cursor(c); 
    dbms_output.put_line('SQL Ok'); 
exception 
    when others then 
    dbms_sql.close_cursor(c); 
    dbms_output.put_line('SQL Not Ok'); 
end; 
/
0

आप सिंटैक्स चेक (download here) करने के लिए Oracle's Pro*C precompiler का उपयोग कर सकते हैं।

यह एक उपकरण है जो कच्चे ओरेकल एसक्यूएल कथन वाले सी कोड को प्रीकंपाइल करने के लिए है, लेकिन आप SQL वाक्यविन्यास जांच करने के लिए इसे "दुरुपयोग" कर सकते हैं।

  1. इस कोड के साथ एक फ़ाइल test.pc बनाएँ:

    EXEC एसक्यूएल चुनें * दोहरी से थे 1 = 1;

    proc INAME = परीक्षण SQLCHECK = SYNTAX

  2. आप इस उत्पादन देखेंगे:: पंक्ति 1 में

    सिंटैक्स त्रुटि, स्तंभ 34, फ़ाइल

  3. भागो इस आदेश precompiler उपकरण स्थापित करने के बाद test.pc: लाइन 1 में त्रुटि, फ़ाइल test.pc
    EXEC SQL चयन * डुएल वेर 1 = 1 से कॉलम 34 में त्रुटि;
    ................................. 1
    पीसीसी-एस -02201, प्रतीक "1" निम्न में से किसी एक की अपेक्षा करते समय:
    ; , संघ, कनेक्ट, समूह, होने, छेड़छाड़, शून्य, आदेश, प्रारंभ, कहां,
    "रखने" के प्रतीक को "1" जारी रखने के लिए प्रतिस्थापित किया गया था।

यह आपके समाधान में इसे एकीकृत करने के लिए सरल होना चाहिए।

ध्यान दें कि यह ऑनलाइन अर्थशास्त्र जांच भी कर सकता है, यह सत्यापित करता है कि सभी उपयोग की गई प्रक्रियाएं और सारणी एक विशिष्ट स्कीमा में मान्य हैं। इसके लिए आप SQLCHECK = SEMANTICS USERID = youruser