سؤال

وعند تشغيل ما يلي في أوراكل قذيفة أنه يعمل بشكل جيد

truncate table table_name

ولكن عندما أحاول وضعه في إجراء مخزن

CREATE OR REPLACE PROCEDURE test IS
BEGIN
    truncate table table_name;
END test;
/

وفشلت مع

ERROR line 3, col 14, ending_line 3, ending_col 18, Found 'table', Expecting:  @   ROW  or   (   or   .   or   ;   :=

لماذا؟

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

المحلول

وجميع البيانات DDL في أوراكل PL / SQL يجب استخدام تنفيذ فوري قبل البيان. ومن هنا يجب عليك استخدام:

execute immediate 'truncate table schema.tablename';

نصائح أخرى

وكذلك تنفيذ فوري يمكنك أيضا استخدام

وDBMS_UTILITY.EXEC_DDL_STATEMENT('TRUNCATE TABLE tablename;');

وفشل بيان لأن بروك المخزنة يتم تنفيذ DDL وبعض حالات DDL يمكن أن يبطل بروك المخزنة. باستخدام تنفيذ الفوري أو نهج exec_ddl يتم تنفيذ DDL خلال التعليمات البرمجية غير موزع.

وعندما نفعل ذلك لك ذكي neeed إلى البحث عن حقيقة أن DDL يصدر ارتكاب ضمني قبل وبعد التنفيذ على حد سواء.

ومحاولة رمز أدناه

execute immediate 'truncate table tablename' ;

ويجب أن نعرف أنه ليس من الممكن لتشغيل مباشرة بيان DDL مثلك لDML من كتلة / SQL PL لPL / SQL لا يدعم الربط المتأخر مباشرة فقط يؤيدون وقت الترجمة الملزمة التي على ما يرام لDML. وبالتالي التغلب على هذا النوع من أوراكل مشكلة قدمت نهجا SQL ديناميكية والتي يمكن استخدامها لتنفيذ نهج مزود الديناميكي DDL statements.The حول تحليل وربط سلسلة SQL في وقت التشغيل. أيضا يجب أن rememder أن البيانات DDL هي من السيارات الافتراضي ارتكاب بالتالي يجب أن تكون حذرا حول أي من بيان DDL باستخدام نهج SQL ديناميكية طارئ إذا كان لديك بعض DML (الذي يحتاج الى ارتكبت صراحة باستخدام TCL) قبل تنفيذ DDL في المخزنة إجراءات / وظيفة.

ويمكنك استخدام أي من نهج مزود الديناميكي التالية لتنفيذ عبارة DDL من PL / SQL كتلة.

1) تنفيذ فوري

2) حزمة DBMS_SQL

و3) DBMS_UTILITY.EXEC_DDL_STATEMENT (parse_string في VARCHAR2)؛

وهذا الأمل يجيب سؤالك مع الشرح.

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