2009-05-05 3 views
1

Это сводит меня с ума на некоторое время:Использование% TYPE на поле записи в PL/SQL

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; 

Может кто-нибудь объяснить мне, почему он не работает? Есть ли способ ссылаться на тип, объявленный в определении записи, вместо того, чтобы явно определять его снова в функции?

Спасибо.

ответ

1

посмотреть на documentation. % TYPE и% ROWTYPE - использовать только для ссылки на базу данных столбцы. но вы пытаетесь сделать ссылочный тип пользователя.

Решение определяет ваш тип pl/sql с% TYPE-referer в столбце базы данных, а затем создает функцию с параметрами, относящимися к одному столбцу базы данных.

UPDATE

его не полная правда, потому что ведущий комментатор пост полезной идеи. summary% TYPE и% ROWTYPE могут ссылаться не только на столбцы таблицы. ссылаются на «реальные» объекты, такие как переменные и курсоры, тоже хороши.

4

Вам необходимо создать переменную вашего типа для ссылки на атрибуты.

Добавьте это после объявления типа и перед функцией.


    attrib_value AttribValueRec; 

Затем в заголовке функции вы можете ссылаться на тип атрибутов в вашей функции, как это:


    attr attrib_value.attr%TYPE; 
+0

большой ответ! Как ты это узнал! и обходной путь все еще существует в 11 г ... Надеюсь, что Oracle в ближайшее время осуществит что-то более разумное. – Pancho

 Смежные вопросы

  • Нет связанных вопросов^_^