استخدام %TYPE في حقل سجل في PL/SQL
-
05-07-2019 - |
سؤال
لقد كان هذا يقودني إلى الجنون لفترة من الوقت:
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;