سؤال

أنا جديد في أوراكل ولا أعرف ما هو الخطأ في هذا الزناد:

CREATE OR REPLACE TRIGGER  "propuesta_casas" 
BEFORE INSERT ON "PROPUESTA_TIENDA_BARRIO"
FOR EACH ROW
 WHEN (new."CASASCAL" IS NULL) 
 BEGIN
    SELECT PROPUESTA.CASAS
    INTO :new."CASASCAL"
    FROM PROPUESTA WHERE PROPUESTA.IDPROPUESTA=new.IDPROPUESTA ;
 END;
/

خطأ:

PL/SQL: ORA-00904: "New". "IdPropuesta": معرف غير صالح

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

المحلول

من ما وصفته:

حاول إعادة ترجمة الزناد ومعرفة ما يحدث ...

يصبح الزناد غير صالح إذا أصبح الكائن الأساسي (على سبيل المثال..الملح) غير صالح أو تم تغييره ويشير الزناد إلى الجدول المصاب.

نصائح أخرى

لست متأكدًا من سبب قبول الإجابة المقبولة لأنه لا يبدو أن التعليقات المرفقة تعالج المشكلة الواضحة في الكود المنشور.

في جسم الزناد ، نقوم بالقيم المرجعية في الصف المدرج مع :NEW كلمة الكود. يفتقر الرمز المنشور إلى القولون عندما يشير إلى العمود في الفقرة. هذا ما هو مطلوب:

CREATE OR REPLACE TRIGGER  "propuesta_casas" 
BEFORE INSERT ON "PROPUESTA_TIENDA_BARRIO"
FOR EACH ROW
 WHEN (new."CASASCAL" IS NULL) 
 BEGIN
    SELECT PROPUESTA.CASAS
    INTO :new."CASASCAL"
    FROM PROPUESTA 
    WHERE PROPUESTA.IDPROPUESTA=:new.IDPROPUESTA ;
 END;
/

بالمناسبة ، احترس من استخدام العلبة السفلية في عروض أسعار مزدوجة عند إنشاء كائنات.

بشكل افتراضي ، يتم تخزين جميع أسماء Oracle في قاموس البيانات في الحالة العليا ، ولكن عبارات SQL غير حساسة للحالة. لذلك يشير الإحصاءان التاليان إلى نفس الكائن:

select * from emp
/
select * from EMP
/

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

create table "emp"  ...

... ثم سيفشل هذا البيان:

select * from emp
/

يجب أن يكون

select * from "emp"
/

بالطبع إذا كان لدينا بالفعل جدول يسمى EMP ، فإن البيان الأول كان قد نجح ، لو كان من الممكن أن يختار فقط من جدول مختلف.

في حالة المشغلات ، لا نشير إليها عمومًا بالاسم. ولكن يتعين علينا استخدام القضية كلما بحثنا عن المشغل في قاموس البيانات:

select status
from user_triggers
where trigger_name = 'propuesta_casas'
/
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top