Использование% TYPE для поля записи в PL / SQL - PullRequest
1 голос
/ 05 мая 2009

Это сводило меня с ума на некоторое время:

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;

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

Спасибо.

Ответы [ 2 ]

4 голосов
/ 05 мая 2009

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

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


  attrib_value  AttribValueRec;

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


  attr  attrib_value.attr%TYPE;
1 голос
/ 05 мая 2009

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

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

UPDATE

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...