أوراكل: هل هناك طريقة للحصول على أخطاء في بناء جملة SQL الحديثة؟

StackOverflow https://stackoverflow.com/questions/3468216

  •  28-09-2019
  •  | 
  •  

سؤال

نشهد الكثير من أخطاء "ORA-00936: التعبير المفقود" في سجل التطبيق الخاص بنا. هل هناك طريقة في Oracle لتحديد ما هي العبارات (الإقرارات) التي تفشل؟

حاولت الاستعلام عن v $ SQL ، لكن هذه العبارات لا يتم إدراجها في هذا الرأي ، لأنها لا تمرر الشيكات بناء الجملة.

يستخدم تطبيق C# الخاص بنا LINQ لإنشاء استعلام إلى قاعدة بيانات Oracle. هذا يجعل من الصعب بعض الشيء الحصول على استعلام SQL من التطبيق. كنت آمل أن أتمكن من الحصول عليها من Oracle أسهل.

هل كانت مفيدة؟

المحلول

يمكنك إنشاء مشغل في 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;
/

تذكر أن تسقط (أو تعطيل) الزناد عند الانتهاء منه.

نصائح أخرى

إذا تمكنت من تمكين SQL Tracing من رمز التطبيق بطريقة أو بأخرى (مجموعة SQL_TRACE = TRUE) ، فستظهر العبارات في ملفات التتبع على مضيف قاعدة البيانات.

يمكنك محاولة استخدام شيء مثل Wireshark على المنفذ المستخدم للاتصال بـ Oracle لمعرفة ما يتم إرسال عبارات SQL. قد لا تكون أفضل إجابة-لكنها قد تحصل على المكان الذي تحتاج إلى الذهاب إليه بشكل أسرع.

جرب حل مراقبة SQL من Kris Vandermotten Blog.

كما يمكنك إعادة توجيه السجل مع خاصية datacontext.log :

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

أو استخدم أي أدوات تصحيح أخطاء أخرى مثل LINQ لتصور الكيانات ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top