Объявление типа для переменной с таблица.столбец %TYPE

Данный скрипт представлен в книге - "Oracle PL/SQL для профессионалов":

PROCEDURE explain_joke (main_category_in IN joke_category.category_id%TYPE)
IS
 /*
 || Курсор со списком параметров, состоящим
 || из единственного строкового параметра.
 */
 CURSOR joke_cur (category_in IN VARCHAR2)
 IS
 SELECT name, category, last_used_date
 FROM joke
 WHERE category = UPPER (category_in);
 joke_rec joke_cur%ROWTYPE;
BEGIN
 /* Теперь при открытии курсора ему передается аргумент */
 OPEN joke_cur (main_category_in)

Объясните, пожалуйста, почему при объявлении типа для параметра в процедуре explain_joke указывается таблица.столбец (joke_category.category_id).

Это ошибка или такой вариант объявления переменной разрешен?


Ответы (1 шт):

Автор решения: 0xdb

Это не ошибка. Атрибут %TYPE является частью синтаксиса PL/SQL.

Он позволяет объявить константу, переменную, или параметр подпрограммы с тем же типом данных, что и ранее объявленная переменная или столбец таблицы, не зная точно, что это за тип данных.

Если меняется объявление ссылаемого элемента, то соответственно меняется и объявление ссылающегося элемента.

Например:

declare
    val varchar2 (8);
    ref val%type := 'abcdef';
begin null;
end;
/
PL/SQL procedure successfully completed.

А если так:

declare
    val varchar2 (4);
    ref val%type := 'abcdef';
begin null;
end;
/

ORA-06502: PL/SQL: numeric or value error: character string buffer too small

→ Ссылка