Я уверен, что у Вас есть свои причины, но на всякий случай... необходимо также рассмотреть использование запроса "слияния" вместо этого:
begin
merge into some_table st
using (select 'some' name, 'values' value from dual) v
on (st.name=v.name)
when matched then update set st.value=v.value
when not matched then insert (name, value) values (v.name, v.value);
end;
(измененное вышеупомянутое, чтобы быть в начать/закончить блоке; очевидно, можно выполнить его независимо процедуры также).
Конечно, то, что вы делаете, сработает, но это что-то вроде старой закалки. Вы пытались поместить это в другой шаблонный класс, от которого можно было бы унаследоваться?
template <typename T>
class template_defs
{
public:
// types
typedef T value_type;
typedef const value_type const_value_type;
typedef value_type& reference;
typedef const_value_type& const_reference;
typedef value_type* pointer;
typedef const_value_type* const_pointer;
};
template <typename T>
class the_class : public template_defs<T>
...