أورا-28579:خطأ في الشبكة أثناء رد الاتصال من وكيل الإجراء الخارجي

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

سؤال

هل رأى أي شخص هذا الخطأ عند محاولة استدعاء دالة C خارجية من استعلام Oracle؟أنا أستخدم Oracle 10g وأحصل على هذا الخطأ في كل مرة أحاول فيها الاتصال بإحدى الوظيفتين الموجودتين في المكتبة.يُرجع استدعاء الوظيفة الأخرى بشكل جيد في كل مرة، على الرغم من أن الوظيفة التي تعمل كلها مستقلة بذاتها، ولا توجد استدعاءات لأي من وظائف OCI*.

إليك الإجراء المخزن الذي يتم استخدامه لاستدعاء رمز C الفاشل:

CREATE OR REPLACE PROCEDURE index_procedure(text in clob, tokens in out nocopy clob, location_needed in boolean)
as language c
name "c_index_proc"
library lexer_lib
with context
parameters
(
  context,
  text,
  tokens,
  location_needed
);

سيكون موضع تقدير أي مساعدة.كل ما وجدته في رسالة الخطأ هذه يشير إلى أن الإجراء الذي يجب اتخاذه هو:اتصل بدعم عملاء أوراكل.

يحرر:لقد قمت بتضييق نطاقه إلى النقطة التي أعرف فيها أن هناك خطأ عميقًا في libclntsh بعد أن اتصلت بـ OCILobTrim (لاقتطاعه إلى 0 طول) على clob الرموز المميزة.هذا هو الرمز الذي كنت أستخدمه لاستدعاء هذا الإجراء.

declare text CLOB; tokens CLOB;
begin
dbms_lob.createtemporary(tokens, TRUE);
dbms_lob.append(tokens, 'token');
dbms_lob.createtemporary(text, TRUE);
dbms_lob.append(text, '<BODY>Test Document</BODY>');
index_procedure(text, tokens, FALSE);
dbms_output.put_line(tokens);
end;
/

هل هناك خطأ ما في هذا الإعداد قد يتسبب في حدوث مشكلات في OCILobTrim؟

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

المحلول 2

حسنا، ترقية إلى 10.2.0.4 (كانت تستخدم 10.2.0.1) على الأقل أعطاني خطأ مفهومة بدلا من ملف أساسية غير مجدية إلى حد ما وORA-28579.

وتبين أن الرمز كنت التصحيح وعلى افتراض أن يدعو OCILobRead سيعود كافة البيانات في مرور واحد. وهذا هو الحال بالنسبة لأي عميل باستخدام مجموعة أحرف عرض ثابت.

لعملاء باستخدام مجموعة أحرف عرض متغير، وهذا ليس هو الحال، OCILobRead كان يقرأ في الواقع جزء من البيانات وإعادة OCI_NEED_DATA ومكالمات المستقبلية لOCILobTrim وOCILobWrite وفشلها بسبب الدعوة لا تزال معلقة إلى OCILobRead. وكان الحل لحلقة OCILobRead المكالمات حتى لم تعد عاد OCI_NEED_DATA وكان لدينا كافة البيانات المطلوبة في المخزن لدينا.

ودعوة إلى OCIBreak أيضا من شأنه أن يسمح وظائف OCILobTrim وOCILobWrite على الاستمرار، على الرغم من أننا لم يكن لديها جميع البيانات المدخلة الحاجة.

نصائح أخرى

يبدو أن هذا أحد تلك الأخطاء التي تعني بشكل أساسي أن أي عدد من الأشياء قد يحدث بشكل خاطئ في الإجراء الخارجي.

يوجد خطأ معروف في الإصدار 10.2.0.3، ولا توجد فكرة عما إذا كان ذا صلة:

يحدث ORA-28579 عند محاولة تحديد البيانات من وظيفة جدول أنابيب يتم تنفيذها في "C" باستخدام واجهة ODCILITY/anyDATASET.يعمل OdCitabledScribe بشكل جيد ولكن OdCitableFetch يولد خطأ ORA-28579.

أود أن أقترح:

  1. انظر إلى دلائل تتبع خادم قاعدة البيانات ، والدليل الذي يوجد فيه PROC الخارجي ، لأي سجل أو ملفات تتبع تم إنشاؤها عند حدوث الخطأ.
  2. قم بتوصيل بروك الخارجي بطريقة ما حتى تتمكن من محاولة تتبع تنفيذها بنفسك.
  3. اتصل بدعم أوراكل
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top