2010-08-12 15 views
5

हम अपने आवेदन लॉग में बहुत से "ORA-00936: अनुपलब्ध अभिव्यक्ति" त्रुटियां देख रहे हैं। क्या ओरेकल में यह निर्धारित करने का कोई तरीका है कि कौन से कथन विफल हो रहे हैं?ओरेकल: क्या हालिया एसक्यूएल सिंटैक्स त्रुटियों को पाने का कोई तरीका है?

मैंने v $ sql से पूछताछ करने का प्रयास किया, लेकिन इन कथनों को उस दृश्य में सम्मिलित नहीं किया गया है, क्योंकि वे वाक्यविन्यास जांच पास नहीं करते हैं।

हमारा सी # एप्लिकेशन ओरेकल डेटाबेस में एक क्वेरी उत्पन्न करने के लिए लिंक का उपयोग कर रहा है। यह एप्लिकेशन से एसक्यूएल क्वेरी प्राप्त करना थोड़ा मुश्किल बनाता है। मैं उम्मीद कर रहा था कि मैं इसे ओरेकल से आसानी से प्राप्त कर सकता हूं।

उत्तर

5

आप (या Oracle में एक ट्रिगर है कि सभी त्रुटियों को प्रवेश करेंगे बना सकते हैं काफी सब - NO_DATA_FOUND को कोई त्रुटि नहीं माना जाता है)। नीचे दिए गए उदाहरण में, स्कीमा में कोई भी त्रुटि TRACK_DETAIL तालिका में दर्ज की गई है (एक पंक्ति में त्रुटि, अगली में विफल SQL)। आप इसे और अधिक एक क्रम संख्या, दिनांक/समय आदि

create table track_detail (val varchar2(4000)); 

create or replace procedure track (p_text IN VARCHAR2) IS 
    PRAGMA AUTONOMOUS_TRANSACTION; 
begin 
    insert into track_detail(val) 
    values (p_text); 
    commit; 
end; 
. 
/
create or replace TRIGGER log_err after servererror on schema 
DECLARE 
    v_temp VARCHAR2(2000) := substr(dbms_utility.format_error_stack,1,2000); 
    v_num NUMBER; 
    v_sql_text ora_name_list_t; 
begin 
    v_temp := translate(v_temp,'''','"'); 
    track(v_temp); 
    v_num := ora_sql_txt(v_sql_text); 
    v_temp := null; 
    BEGIN 
    FOR i IN 1..v_num LOOP 
     v_temp := v_temp || v_sql_text(i); 
    END LOOP; 
    EXCEPTION 
    WHEN VALUE_ERROR THEN NULL; 
    END; 
    v_temp := translate(v_temp,''''||chr(0)||chr(10),'"'); 
    track(v_temp); 
end; 
/

ड्रॉप के लिए याद रखें (या अक्षम) ट्रिगर जब आप इसके साथ समाप्त कर दिया है के साथ परिष्कृत कर सकते हैं।

+0

+1 मैं अपना उत्तर लिखते समय डेटाबेस-स्तरीय ट्रिगर्स के बारे में भूल गया :( – ThinkJet

+0

बहुत बढ़िया है। मुझे नहीं पता था कि आप "सर्विसरर" पर ट्रिगर बना सकते हैं! धन्यवाद! – CodingWithSpike

+0

इसे उत्तर के रूप में स्वीकार किया क्योंकि यह मेरी स्थिति के लिए सबसे अच्छा काम करता था। मैं एक चल रहे डीबी में जा सकता हूं, ट्रिगर बना सकता हूं, त्रुटि प्राप्त कर सकता हूं, और उपयोगकर्ताओं को प्रभावित किए बिना ट्रिगर को हटा सकता हूं या ऐप कोड को फिर से तैनात कर सकता हूं। धन्यवाद गैरी! – CodingWithSpike

1

आप ओरेकल से कनेक्ट करने के लिए प्रयुक्त बंदरगाह पर वायरसहार्क जैसे कुछ का उपयोग करने का प्रयास कर सकते हैं यह देखने के लिए कि SQL कथन क्या भेजा जा रहा है। शायद सबसे अच्छा जवाब न हो - लेकिन यह आपको प्राप्त कर सकता है जहां आपको तेज़ी से जाने की आवश्यकता है।

2

यदि आप किसी भी तरह से एप्लिकेशन कोड से एसक्यूएल ट्रेसिंग सक्षम कर सकते हैं (सत्र सेट sql_trace = true) बदलें, स्टेटमेंट डेटाबेस होस्ट पर ट्रेस फ़ाइलों में दिखाई देगा।

1

Kris Vandermotten blog से SQL निगरानी समाधान का प्रयास करें।

इसके अलावा, आप DataContext.Log property साथ लॉग अनुप्रेषित कर सकते हैं:

using (NorthwindDataContext context = new NorthwindDataContext()) 
{ 
    context.Log = Console.Out; 
} 

या LInQ to Entities Visualizer की तरह किसी भी अन्य डीबगिंग टूल का उपयोग करें ...

+0

मुझे कभी एहसास नहीं हुआ कि लॉग संपत्ति वहां थी। उसके लिए धन्यवाद! तकनीकी रूप से हम एक एंटीटी फ्रेमवर्क ऑब्जेक्ट कॉन्टेक्स्ट के खिलाफ एक लिंक अभिव्यक्ति का उपयोग कर रहे हैं, डेटाकॉन्टेक्स्ट नहीं। यह सर्वर पर भी था, मुझे कोड बदलने के लिए उपयोग नहीं है, इसलिए मैं ओरेकल से क्वेरी को पकड़ना चाहता हूं। – CodingWithSpike

संबंधित मुद्दे