سؤال

كل شيء ،

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

على سبيل المثال تخزين الإجراء هو على النحو التالي:

CREATE OR REPLACE PROCEDURE ashish_test
AUTHID CURRENT_USER IS
BEGIN
     DECLARE
          v_tab     VARCHAR2(50);
          v_strSQL  VARCHAR2(50);
     BEGIN
          v_strSQL := 'SELECT * FROM :1';
          v_tab    := 'ex.emp';
          EXECUTE IMMEDIATE v_strSQL USING v_tab;
     END;
END;

عندما أتصل فوق الإجراء المخزن باستخدام CALL ashish_test(), أنا الحصول على :

رسالة الخطأ http://web1.twitpic.com/img/12831839-06a3ea536df5d5a0a839eb83d9e59d25.4a3936b8-scaled.jpg

على أساس هذه المادة (انظر على سبيل المثال 7-1), USING الكلمة يجب أن يحل محل مرقمة نائبا (:1) داخل v_strSQL مع القيمة المخزنة في v_tab.ومع ذلك ، وأظل الحصول على الجدول غير صالح خطأ.أنا أظن أن هذا بسبب EXECUTE IMMEDIATE هو قادر على استبدال العنصر النائب مع قيمة لسبب ما ولكن أنا لست متأكدا من السبب في ذلك.لا أحد يعرف إذا أنا أفعل شيئا غبيا هنا ؟

أنا على التوالي على قاعدة بيانات أوراكل 10g & استخدام PL/SQL Developer.

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

المحلول

استخدام البند هو فقط من أجل ربط المتغيرات (أيحيث يمكنك استخدام أسماء الأعمدة في عبارة select), لا أسماء الجداول.الاستخدام النموذجي تبدو مثل هذا:

Select col1 from table1 where col2 = :a

إذا كنت تريد استخدام متغير الجدول الأسماء استخدام شيء مثل هذا:

         v_tab    := 'ex.emp';
         v_strSQL := 'SELECT * FROM ' || v_tab;
         EXECUTE IMMEDIATE v_strSQL;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top