الانتقال إلى المحتوى

استعمال أوامر Dml مع Procedure


محمد جمعه

Recommended Posts

السلام عليكم ورحمة الله وبركاته

CREATE OR REPLACE FUNCTION count_before
RETURN NUMBER
IS CURSOR c1 IS  SELECT table_name
                  FROM user_tables
                 where table_name like 'AA%'
                    or table_name like 'AB%'
              order by table_name;
v_sql       LONG        ;
v_sql1      LONG        ;
v_count     NUMBER := 0 ;
v_count_all NUMBER := 0 ;
BEGIN
  FOR rec IN c1 LOOP
     v_sql := 'SELECT COUNT(*) FROM ' || rec.table_name;
     EXECUTE IMMEDIATE v_sql INTO v_count;
v_sql1 := 'insert into table1(name, col1) values ( '||rec.table_name||' , '||v_count||' )';
EXECUTE IMMEDIATE v_sql1;
     dbms_output.PUT_LINE(rec.table_name ||' :- '|| v_count);
     v_count_all := v_count_all + v_count;
  END LOOP;
--commit;
  RETURN v_count_all;
END;


هذه الفانكشن تحسب كل السجلات في كل الجداول وهي تعمل صحيح
التعديل المطلوب تنفيذه أن يتم ادخالInsertفي جدول( السطر رقم 16 ورقم 17 ) table1 بقيم أسم جدول وعدد السجلات في هذا الجدول
وعند التنفيذ يعطي خطأ

SQL> select count_before from dual;
select count_before from dual
      *
ERROR at line 1:
ORA-00984: column not allowed here
ORA-06512: at "MISR.COUNT_BEFORE", line 17


ولا أعرف لماذا
نرجو الإفادة جزاكم الله كل خير
[email protected]

تم تعديل بواسطة محمد جمعه
رابط هذا التعليق
شارك

السلام عليكم ورحمة الله وبركاته
CREATE OR REPLACE FUNCTION count_before
RETURN NUMBER
IS CURSOR c1 IS  SELECT table_name
                  FROM user_tables
                 where table_name like 'AA%'
                    or table_name like 'AB%'
              order by table_name;
v_sql       LONG        ;
v_sql1      LONG        ;
v_count     NUMBER := 0 ;
v_count_all NUMBER := 0 ;
BEGIN
  FOR rec IN c1 LOOP
     v_sql := 'SELECT COUNT(*) FROM ' || rec.table_name;
     EXECUTE IMMEDIATE v_sql INTO v_count;
v_sql1 := 'insert into table1(name, col1) values ( '||rec.table_name||' , '||v_count||' )';
EXECUTE IMMEDIATE v_sql1;
     dbms_output.PUT_LINE(rec.table_name ||' :- '|| v_count);
     v_count_all := v_count_all + v_count;
  END LOOP;
--commit;
  RETURN v_count_all;
END;


هذه الفانكشن تحسب كل السجلات في كل الجداول وهي تعمل صحيح
التعديل المطلوب تنفيذه أن يتم ادخالInsertفي جدول( السطر رقم 16 ورقم 17 ) table1 بقيم أسم جدول وعدد السجلات في هذا الجدول
وعند التنفيذ يعطي خطأ

SQL> select count_before from dual;
select count_before from dual
      *
ERROR at line 1:
ORA-00984: column not allowed here
ORA-06512: at "MISR.COUNT_BEFORE", line 17


ولا أعرف لماذا
نرجو الإفادة جزاكم الله كل خير
[email protected]


الرجاء نشر structure ل table1.

يمكن محاولة إزالة single quotation كالتالي:

v_sql1 := 'insert into table1(name, col1) values ( rec.table_name , v_count(';
رابط هذا التعليق
شارك

لا يجب أن تكون جملة الاستعلام من جدول dual ولكن يجب أن تكون من جدولك أنت table1
ثانياً أنا ألاحظ أنك لم تعمل commit داخل الـprocedure فلم يحدث أمر insert فعلياً

رابط هذا التعليق
شارك

بسم الله الرحمن الرحيم
اشكر الأخوة الزملاء على الردود
لما اعمل داش داش في السطر 16 والسطر 17
الفانكشن تشتغل صح وترجع عدد جميع السجلات لجميع الجداول
التي تبتدي بـ AA أو AB
ولكن أنا لما اشيل الداش داش من السطر 16 والسطر 17 والسطر 21 commit
تطلع خطأ ومش عارف اعمل ايه
[email protected]

تم تعديل بواسطة محمد جمعه
رابط هذا التعليق
شارك

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   تمت استعادة المحتوى السابق الخاص بك.   مسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

جاري التحميل
×
×
  • أضف...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية