Вопрос

Предположим, у меня есть некоторые типы данных, определенные в 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;
Это было полезно?

Решение

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top