سؤال

لقد كان هذا يقودني إلى الجنون لفترة من الوقت:

DECLARE
    TYPE AttrValueRec IS RECORD (
        attr        VARCHAR2(40),
        val         VARCHAR2(2000),
        inst        NUMBER(4)
    );

    FUNCTION create_attrval(attr   AttrValueRec.attr%TYPE,
                            val    AttrValueRec.val%TYPE,
                            inst   AttrValueRec.inst%TYPE := 1)
    RETURN AttrValueRec IS
        attr_value  AttrValueRec;
    BEGIN
        attr_value.attr := attr;
        attr_value.val := val;
        attr_value.inst := inst;
        RETURN attr_value;
    END;
BEGIN
    NULL;
END;

استخدام %TYPE في حقل سجل لا يبدو للعمل.وينتج الخطأ التالي:

ORA-06550: line 8, column 36:
PLS-00206: %TYPE must be applied to a variable, column, field or attribute, not to "ATTRVALUEREC.ATTR"
ORA-06550: line 8, column 5:
PL/SQL: Item ignored

بينما يعمل تحديد النوع بشكل صريح مرة أخرى:

DECLARE
    TYPE AttrValueRec IS RECORD (
        attr        VARCHAR2(40),
        val         VARCHAR2(2000),
        inst        NUMBER(4)
    );

    FUNCTION create_attrval(attr   VARCHAR2,
                            val    VARCHAR2,
                            inst   NUMBER := 1)
    RETURN AttrValueRec IS
        attr_value  AttrValueRec;
    BEGIN
        attr_value.attr := attr;
        attr_value.val := val;
        attr_value.inst := inst;
        RETURN attr_value;
    END;
BEGIN
    NULL;
END;

هل يمكن لأحد أن يشرح لي لماذا لا يعمل؟هل هناك طريقة للإشارة إلى النوع المعلن في تعريف السجل بدلاً من تعريفه بشكل صريح مرة أخرى في الوظيفة؟

شكرًا.

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

المحلول

ينظر الى توثيق.%TYPE و%ROWTYPE - يُستخدمان فقط للإشارة إلى قاعدة البيانات أعمدة.لكنك تحاول الإشارة إلى نوع المستخدم.

الحل هو تحديد نوع pl/sql الخاص بك باستخدام مُحيل %TYPE في عمود قاعدة البيانات، ثم إنشاء وظيفة بمعلمات تشير إلى نفس عمود قاعدة البيانات.

تحديث

إنها ليست الحقيقة الكاملة لأن المعلق الرئيسي ينشر فكرة مفيدة.الملخص %TYPE و %ROWTYPE لا يشيران فقط إلى أعمدة الجدول.تعد الإشارة إلى الكائنات "الحقيقية" مثل المتغيرات والمؤشرات جيدة أيضًا.

نصائح أخرى

وتحتاج فعلا إلى إنشاء متغير من النوع الخاص للإشارة إلى الصفات.

وإضافة هذه بعد إعلان نوع وقبل وظيفة.


  attrib_value  AttribValueRec;

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


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