Я сказал бы, что обычно каждый фундаментализм приводит в ад.
Вы, конечно, не хотели бы заканчивать за исключением, управляемый поток, но исключения предотвращения в целом является также плохой идеей. Необходимо найти баланс между обоими подходами. То, что я не сделал бы, должно создать тип исключительной ситуации для каждой исключительной ситуации. Это не продуктивно.
то, Что я обычно предпочитаю, должно создать два основных типа исключений, которые используются по всей системе: LogicalException и TechnicalException. Их могут далее отличить подтипы в случае необходимости, но это не обычно не необходимо.
техническое исключение обозначает действительно непредвиденную исключительную ситуацию как снижающийся сервер базы данных, соединение с веб-сервисом бросило IOException и так далее.
, С другой стороны, логические исключения используются для распространения менее серьезной ошибочной ситуации к верхним уровням (обычно некоторый результат проверки).
обратите внимание на то, что даже логическое исключение не предназначается, чтобы использоваться на регулярной основе, чтобы управлять процессом выполнения программы, а скорее выделить ситуацию, когда поток должен действительно закончиться. Когда используется в Java, оба типа исключительной ситуации , подклассы RuntimeException и обработка ошибок очень аспектно-ориентированы.
Так в примере входа в систему могло бы быть мудро создать что-то как AuthenticationException и отличить конкретные ситуации перечислимыми значениями как UsernameNotExisting, PasswordMismatch и т.д. Тогда Вы не закончите в наличии огромной иерархии исключения и можете сохранить блоки выгоды на удобном в сопровождении уровне. Можно также легко использовать некоторый универсальный механизм обработки исключений, так как Вам категоризировали исключения и знаете вполне прилично, что распространить до пользователя и как.
Наше типичное использование должно бросить LogicalException во время вызова веб-сервиса, когда вход пользователя был недопустим. Исключение упорядочивается к детали SOAPFault и затем не упорядочивается к исключению снова на клиенте, который приводит к показу ошибки проверки на одном определенном поле ввода веб-страницы, так как исключение имеет надлежащее отображение на то поле.
Это - конечно, не единственная ситуация: Вы не должны поражать веб-сервис для подбрасывания исключения. Вы свободны сделать так в любой исключительной ситуации (как в случае, который необходимо привести к сбою быстро) - это - все по усмотрению.
Функция Dump :
возвращает значение VARCHAR2, содержащее код типа данных , длину в байтах и внутреннее представление выражения expr. Возвращаемый результат всегда находится в наборе символов базы данных. Типы данных, соответствующие каждому коду, см. В Таблице 2-1.
Если вы написали запрос, вы могли бы создать просмотреть на его основе, а затем запросить словарь данных, чтобы узнать, каковы типы данных столбцов:
create view vw_test as
select 1 an_integer,
'abc' a_string,
sysdate a_date
from dual;
desc vw_test;
Name Null Type
----------- -------- ------------------
AN_INTEGER NUMBER
A_STRING CHAR(3)
A_DATE DATE
Я предполагаю, однако, вам нужен какой-то общий способ определения этого во время выполнения. Этот метод не очень полезен, поскольку он включает DDL. В этом случае вам может помочь DBMS_SQL:
DECLARE
c NUMBER;
d NUMBER;
col_cnt INTEGER;
f BOOLEAN;
rec_tab DBMS_SQL.DESC_TAB;
col_num NUMBER;
PROCEDURE print_rec(rec in DBMS_SQL.DESC_REC) IS
BEGIN
DBMS_OUTPUT.NEW_LINE;
DBMS_OUTPUT.PUT_LINE('col_type = '
|| rec.col_type);
DBMS_OUTPUT.PUT_LINE('col_maxlen = '
|| rec.col_max_len);
DBMS_OUTPUT.PUT_LINE('col_name = '
|| rec.col_name);
DBMS_OUTPUT.PUT_LINE('col_name_len = '
|| rec.col_name_len);
DBMS_OUTPUT.PUT_LINE('col_schema_name = '
|| rec.col_schema_name);
DBMS_OUTPUT.PUT_LINE('col_schema_name_len = '
|| rec.col_schema_name_len);
DBMS_OUTPUT.PUT_LINE('col_precision = '
|| rec.col_precision);
DBMS_OUTPUT.PUT_LINE('col_scale = '
|| rec.col_scale);
DBMS_OUTPUT.PUT('col_null_ok = ');
IF (rec.col_null_ok) THEN
DBMS_OUTPUT.PUT_LINE('true');
ELSE
DBMS_OUTPUT.PUT_LINE('false');
END IF;
END;
BEGIN
c := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(c, 'SELECT * FROM scott.bonus', DBMS_SQL.NATIVE);
d := DBMS_SQL.EXECUTE(c);
DBMS_SQL.DESCRIBE_COLUMNS(c, col_cnt, rec_tab);
/*
* Following loop could simply be for j in 1..col_cnt loop.
* Here we are simply illustrating some of the PL/SQL table
* features.
*/
col_num := rec_tab.first;
IF (col_num IS NOT NULL) THEN
LOOP
print_rec(rec_tab(col_num));
col_num := rec_tab.next(col_num);
EXIT WHEN (col_num IS NULL);
END LOOP;
END IF;
DBMS_SQL.CLOSE_CURSOR(c);
END;
/