Программирование >>  Oracle 

1 ... 327 328 329 [ 330 ] 331 332 333 ... 469


1408

Глава 20

Блок обработки исключительных ситуаций создан для перехвата и повторного во буждения исключительных ситуаций UTL FILE более удобным образом, чем это делает пакет UTL FILE. Вместо получения в вызывающей подпрограмме обычного сообщения об ошибке (SQLERRM) USER DEFINED EXCEPTION, мы получим нечто более осмысленное, вроде: Недопустим1й режим откр1тия файла. Кроме того, для испытательной ситуации INVALID PATH, которая возбуждается в том случае, когда фа нельзя открыть из-за неверного имени файла или каталога, выполняются дополнительные проверки, и причина ошибки устанавливается более точно. Если владелец этого типа имеет привилегию SELECT на представление SYS.V $PARAMETER, мы выбираем из него значение параметра инициализации UTL FILE DIR и проверяем, можно ли использовать тот каталог, который мы пытаемся использовать. Если нельзя, выдается соответствующее сообщение. Из всех ошибок, происходящих в процессе работы с пакетом UTL FILE, эта, несомненно, самая популярная . Выдавая такое точное сообщение об ошибке, мы сэкономим многие часы отладки для начинающих пользователей пакета UTL FILE.

Продолжая рассмотрение, переходим к методу Open:

55 member function isOpen return boolean

56 is

57 begin

58 return utl file.is open(filetype pkg.g files(g file hdl));

59 end;

Это просто оболочка для существующей функции UTL FILE.IS OPEN. Поскольку эта функция пакета UTLFILE никогда не возбуждает исключительных ситуаций, ее реализация очень проста. Далее идет более сложный метод GET LINE:

61 member function get line return varchar2

62 is

63 l buffervarchar2(32765);

64 begin

65 utlfile.getline(filetypepkg.gfiles(gfile hdl), lbuffer);

66 return lbuffer;

67 exception

68 when utl file.invalid filehandle then

69 raiseapplicationerror

70 (-20002,fileType pkg.g invalid filehandle msg);

71 when utl file.invalid operation then

72 raise application error

73 (-20003,fileType pkg.g invalid operation msg);

74 when utl file.read error then

75 raise application error

76 (-20004,fileType pkg.g read error msg);

77 when utl file.internal error then

78 raise application error

79 (-2 00 06,fileType pkg.g internal error msg);

80 end;

В нем используется локальная переменная типа VARCHAR2(32765), - переменная максимально возможного в PL/SQL размера и одновременно самая длинная строка,



Использование объектно-реляционных средств 1409

которую фактически позволяет прочитать пакет UTL FILE. Как и в представленном ранее методе OPEN, мы перехватываем и обрабатываем исключительные ситуации, которые возбуждаются подпрограммой UTL FILE.GET LINE, и преобразуем их в вызовы RAISE APPLICATION ERROR. Это позволяет выдавать информативные сообщения об ошибках в функции GET LINE (для удобства использования GET LINE реализована как функция, а не как процедура).

Теперь переходим к другой статической процедуре - WRITE IO. Процедура WRITE IO используется единственно для того, чтобы избежать написания одних и тех же обработчиков исключительных ситуаций шесть раз, для каждой из подпрограмм, связанных с записью, поскольку все они возбуждают одни и те же исключительные ситуации. Эта функция, добавленная исключительно для удобства программирования, просто вызывает одну из шести функций пакета UTL FILE и обрабатывает все возможные ошибки:

82 static procedure write io(p file in number,

83 p operation in varchar2,

84 p parml in varchar2 default null,

85 p parm2 in varchar2 default null,

86 p parm3 in varchar2 default null,

87 p parm4 in varchar2 default null,

88 p parm5 in varchar2 default null,

89 p parm6 in varchar2 default null)

90 is

91 l file utl file.file type default filetype pkg.g files(p file);

92 begin

93 if (p operation=close) then

94 utl file.fclose(l file);

95 elsif (p operation=put) then

96 utl file.put(l file,p parml) ;

97 elsif (p operation=new line) then

98 utl file.new line(l file,p parm1);

99 elsif (p operation=put line) then

100 utl file.put line(l file, p parml);

101 elsif (p operation=flush) then

102 utl file.fflush(l file);

103 elsif (p operation=putf) then

104 utl file.putf(l file,p parml, p parm2 ,

105 p parm3 , p parm4 , p parm5 ,

106 p parm6);

107 else raise program error;

108 end if;

109 exception

110 when utl file.invalid filehandle then

111 raise application error

112 (-20002,fileType pkg.g invalid filehandle msg);

113 when utl file.invalid operation then

114 raise application error

115 (-20003,fileType pkg.g invalid operation msg);

116 when utl file.write error then



1410

Глава 20

117 118 119 120 121

raise application error

(-2 0005,fileType pkg.g write error msg); when utl file.internal error then raise application error

(-2 0006,fileType pkg.g internal error msg);

end;

Остальные методы вызывают метод WRITE IO с соответствующими параметрами:

124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166

member procedure close is

begin

fileType.write io(g file hdl, close) ; filetype pkg.g files.delete(g file hdl);

end;

member procedure put(p text in varchar2) is

begin

fileType.write io(g file hdL,

end;

member procedure new line(p lines is

begin

fileType.write io(g file hdl,

end;

put,p text);

in number default 1)

new line,p lines);

member procedure put line(p text in varchar2) is

begin

fileType.write io(g file hd1, end;

put line, p text);

member procedure putf

(p fmt in varchar2, p argl in varchar2 default null, p arg2 in varchar2 default null, p arg3 in varchar2 default null, p arg4 in varchar2 default null, p arg5 in varchar2 default null) is

begin

fileType.write io (g file hd1, putf, p fmt, p argl, p arg2, p arg3, p arg4, p arg5) ;

end;

member procedure flush is

begin

fileType.write io(g file hdl, flush); end;

end;



1 ... 327 328 329 [ 330 ] 331 332 333 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика