Общее поведение в параметрах процедуры PL / SQL - PullRequest
3 голосов
/ 08 мая 2009

Предположим, у меня есть некоторые типы данных, определенные в PL / SQL:

TYPE foo_t IS RECORD (...);
TYPE foo_table_t IS TABLE OF foo_t INDEX BY BINARY_INTEGER;

TYPE bar_t IS RECORD (...);
TYPE bar_table_t IS TABLE OF bar_t INDEX BY BINARY_INTEGER;

Можно ли мне написать процедуру, способную принимать в качестве параметра любой тип данных, полученный из TABLE (например, foo_table_t или bar_table_t)? Процедура не нуждается в знании типов строк таблицы. Тривиальный пример:

PROCEDURE remove_last(some_table ...) IS
BEGIN
    some_table.DELETE(some_table.LAST);
END;

1 Ответ

6 голосов
/ 08 мая 2009

Не напрямую. Из руководства программиста PL / SQL:

"Фактический параметр и соответствующий ему формальный параметр должны иметь совместимые типы данных."

PL / SQL выполняет неявное преобразование типов данных фактических параметров в типы данных формальных параметров. Таким образом, вы можете передать числовое значение процедуре, которая хочет строку, и это сработает, потому что вы можете выполнить неявное преобразование.

Лучшее, что вы можете сделать, это написать перегруженные процедуры:

ОБЩАЯ ПРОЦЕДУРА (foo IN OUT foo_t);

ОБЩАЯ ПРОЦЕДУРА (bar IN OUT bar_t);

Затем вы можете вызывать шаблон с любым типом записи. Это теряет привлекательность пропорционально количеству обрабатываемых типов записей: -D

...