Динамическое объявление / запрос в Oracle 9i
В Oracle, учитывая список имен таблиц, я хочу выполнить операторы "выбрать столбец1 в переменную1 из таблицы" для большого количества таблиц. И я хочу сделать это для всех столбцов таблицы. Я не могу объявить тип var1, пока запрос с user_tab_columns не возвращает тип столбца. Я попытался объявить var1 как sys.anytype, но получил ORA-00932 с сообщением об ошибке, таким как "несовместимые типы данных: ожидаемый CHAR получил CHAR".
Так как я могу обойти эту ошибку или как я могу динамически объявить переменную? Большое спасибо.
2 ответа
Крейг прав, вы, вероятно, должны объявить его как VARCHAR2 вместо anytype.
В этой статье Джеффа Хантера есть хорошая функция, которая позволяет легко заполнять вашу переменную так, чтобы она не сломалась, если ваши данные не могут быть преобразованы.
CREATE OR REPLACE FUNCTION getData(data IN SYS.ANYDATA)
RETURN VARCHAR2
AS
l_varchar2 VARCHAR2(4000);
l_rc NUMBER;
BEGIN
CASE data.getTypeName
when 'SYS.NUMBER' then
l_rc := data.getNumber(l_varchar2);
when 'SYS.DATE' then
l_rc := data.getDate(l_varchar2);
when 'SYS.VARCHAR2' then
l_rc := data.getVarchar2(l_varchar2);
else
l_varchar2 := '** unknown **';
END CASE;
RETURN l_varchar2;
END;
Большинство типов данных неявно преобразуются в VARCHAR. Очевидно, что есть исключения, но если ваши таблицы - это только varchars, даты и числа, то все будет в порядке.