سؤال

أعتقد أنني ربما أفتقد شيئًا ما هنا.هنا هو الجزء ذو الصلة من الزناد:

CURSOR columnNames (inTableName IN VARCHAR2) IS 
   SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = inTableName;
/* Removed for brevity */
OPEN columnNames('TEMP');

وهذه هي رسالة الخطأ التي أعود بها،

27/20   PLS-00306: wrong number or types of arguments in call to 'COLUMNNAMES'
27/2    PL/SQL: Statement ignored

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


@ماثيو - أقدر المساعدة، ولكن السبب الذي جعلني في حيرة من أمري هو أن هذا الجزء من التعليمات البرمجية لا يعمل معي ويثير الأخطاء المشار إليها.لدينا مشغلات أخرى في قاعدة البيانات تحتوي على تعليمات برمجية تقريبًا تمامًا، لذلك لست متأكدًا مما إذا كان هذا خطأ ارتكبته، أو شيء يتعلق بكيفية محاولتي تخزين المشغل، وما إلى ذلك.


@ماثيو - حسنًا، الآن أشعر بالحرج.لقد قمت بنسخ/لصق الكود الذي قدمته في مشغل جديد وكان يعمل بشكل جيد.لذلك عدت إلى المشغل الأصلي وحاولت ذلك وتلقيت رسالة الخطأ مرة أخرى، إلا أنني هذه المرة بدأت في حذف أشياء من المشغل وبعد التخلص من هذا السطر،

FOR columnName IN columnNames LOOP

تم حفظ الأمور بشكل جيد.لذلك اتضح أن المكان الذي اعتقدت أن الخطأ فيه، لم يكن في الواقع حيث كان الخطأ.

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

المحلول

@روب

إذا قمت بقص/لصق الكود الذي لدي هنا، فهل سيعمل؟

كيف/أين تتصل بالرمز الخاص بك؟في الزناد أليس كذلك؟

الاستعلام الذي كتبته هنا، هو في الواقع الكود الذي ينتج الخطأ، أو مجرد مثال (على سبيل المثال، هل يمكنك إعادة إنتاج الخطأ بالاستعلام الذي لديك أعلاه)

نصائح أخرى

لتوضيح سبب المشكلة.كما تقول

فتح columnNames('TEMP');

عملت في حين

FOR columnName في columnNames LOOP

لم.ستعمل عبارة FOR بشكل جيد إذا كانت تتضمن أيضًا المعلمة كما يلي:

FOR columnName IN columnNames('TEMP') LOOP

لا تظهر الكود الذي تجلب منه الصفوف لذا لا أستطيع تحديد غرضك، ولكن حيث أعمل OPEN يُستخدم بشكل شائع لجلب الصف الأول (في هذه الحالة، اسم العمود الأول للجدول المحدد) بينما يتم استخدام FOR للتكرار خلال كافة الصفوف التي تم إرجاعها.

@ تعليق روب.لا يُسمح لي بالتعليق، لذا قم بالتحديث هنا بدلاً من ذلك.المعلمة المفقودة هي ما أصفه أعلاه.لقد أضفت ردًا يفيد بأنك قمت ببساطة بحذف حلقة FOR.لا يبدو أنك، في ذلك الوقت، فهمت سبب إحداث الحذف فرقًا.ولهذا السبب حاولت أن أشرح لك أنه، بناءً على حاجتك، قد تكون حلقة FOR حلاً أفضل.

يعمل بشكل جيد بالنسبة لي.

create or replace procedure so_test_procedure as 
 CURSOR columnNames (inTableName IN VARCHAR2) IS 
   SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = inTableName; 
BEGIN      
 OPEN columnNames('TEMP');
 CLOSE columnNames;
END;

procedure so_test_procedure Compiled.
execute so_test_procedure();

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