Как получить длину Max и Min, разрешенную в столбце varchar2
. Мне нужно проверить входящие данные из таблицы temp, которая поступает с какого-то удаленного db. И каждое значение строки должно быть проверено для определенных столбцов, которое имеет максимальное или минимальное значение, которое может быть установлено в столбце.Получить максимальную длину в столбце | Oracle
Так что я должен был получить спецификации столбцов, используя детали схемы. Я сделал сделать proc
для этого:
PROCEDURE CHK_COL_LEN(VAL IN VARCHAR2,
MAX_LEN IN NUMBER :=4000,
MIN_LEN IN NUMBER :=0,
LEN_OUT OUT VARCHAR2)
IS
BEGIN
IF LENGTH(VAL)<MIN_LEN THEN
LEN_OUT := 'ERROR';
RETURN;
ELSIF LENGTH(VAL)>MAX_LEN THEN
LEN_OUT := 'ERROR';
RETURN;
ELSE
LEN_OUT := 'SUCCESS';
RETURN;
END IF;
END;
END CHK_COL_LEN;
Но проблема в том, что нельзя использовать повторно и немного жёстко. Я должен явно отправлять значения MAX
и MIN
для каждого значения вместе с проверяемыми данными.
Так на proc
вызова, это что-то вроде:
CHK_COL_LEN(EMP_CURSOR.EMP_ID, 5, 1, LEN_ERROR_MSG);
вместо этого я хочу что-то вроде: (! Если что-то вроде этого существуют)
CHK_COL_LEN(EMP_CURSOR.EMP_ID,
EMP.COLUMN_NAME%MAX_LENGTH,
EMP.COLUMN_NAME%MIN_LENGTH,
LEN_ERROR_MSG)
Спасибо заранее.
EDIT
select max(length(col)) from table;
Это решение, но опять-таки мне придется выполнить этот запрос каждый раз, чтобы задать две переменные для MAX и MIN значения. И выполнение дополнительных двух запросов для каждого значения, а затем установка 2 переменных будет стоить значительного снижения производительности при наличии около 32 таблиц, каждая из которых имеет 5-8 столбцов varchar2 и средние строки около 40k-50k в каждой таблице.
Но max (length (col)) даст вам максимальную существующую длину, это не обязательно MAX_LENGTH вашей колонки. Я думаю, что @ road242 прав, единственный способ получить размер столбца - использовать словарь. – Aramillo
Почему вы пытаетесь написать валидацию с использованием словаря данных вместо того, чтобы позволить определению таблицы сделать валидацию для вас? – Allan
Потому что я хочу поймать это перед рукой. Как только исключение будет выброшено (даже если оно будет обработано вручную), он затем пропустит операции, запланированные позже (возьмите сценарий, когда произойдут только несколько циклов цикла, а затем выброшенные исключения), тогда цикл заканчивается при первом возникновении исключения. – Sachin