Oracle определяет тип данных

Я сказал бы, что обычно каждый фундаментализм приводит в ад.

Вы, конечно, не хотели бы заканчивать за исключением, управляемый поток, но исключения предотвращения в целом является также плохой идеей. Необходимо найти баланс между обоими подходами. То, что я не сделал бы, должно создать тип исключительной ситуации для каждой исключительной ситуации. Это не продуктивно.

то, Что я обычно предпочитаю, должно создать два основных типа исключений, которые используются по всей системе: LogicalException и TechnicalException. Их могут далее отличить подтипы в случае необходимости, но это не обычно не необходимо.

техническое исключение обозначает действительно непредвиденную исключительную ситуацию как снижающийся сервер базы данных, соединение с веб-сервисом бросило IOException и так далее.

, С другой стороны, логические исключения используются для распространения менее серьезной ошибочной ситуации к верхним уровням (обычно некоторый результат проверки).

обратите внимание на то, что даже логическое исключение не предназначается, чтобы использоваться на регулярной основе, чтобы управлять процессом выполнения программы, а скорее выделить ситуацию, когда поток должен действительно закончиться. Когда используется в Java, оба типа исключительной ситуации , подклассы RuntimeException и обработка ошибок очень аспектно-ориентированы.

Так в примере входа в систему могло бы быть мудро создать что-то как AuthenticationException и отличить конкретные ситуации перечислимыми значениями как UsernameNotExisting, PasswordMismatch и т.д. Тогда Вы не закончите в наличии огромной иерархии исключения и можете сохранить блоки выгоды на удобном в сопровождении уровне. Можно также легко использовать некоторый универсальный механизм обработки исключений, так как Вам категоризировали исключения и знаете вполне прилично, что распространить до пользователя и как.

Наше типичное использование должно бросить LogicalException во время вызова веб-сервиса, когда вход пользователя был недопустим. Исключение упорядочивается к детали SOAPFault и затем не упорядочивается к исключению снова на клиенте, который приводит к показу ошибки проверки на одном определенном поле ввода веб-страницы, так как исключение имеет надлежащее отображение на то поле.

Это - конечно, не единственная ситуация: Вы не должны поражать веб-сервис для подбрасывания исключения. Вы свободны сделать так в любой исключительной ситуации (как в случае, который необходимо привести к сбою быстро) - это - все по усмотрению.

8
задан Steven 6 July 2009 в 14:04
поделиться

2 ответа

Функция Dump :

возвращает значение VARCHAR2, содержащее код типа данных , длину в байтах и ​​внутреннее представление выражения expr. Возвращаемый результат всегда находится в наборе символов базы данных. Типы данных, соответствующие каждому коду, см. В Таблице 2-1.

14
ответ дан 5 December 2019 в 08:54
поделиться

Если вы написали запрос, вы могли бы создать просмотреть на его основе, а затем запросить словарь данных, чтобы узнать, каковы типы данных столбцов:

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:

Из документа 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;
/
5
ответ дан 5 December 2019 в 08:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: