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

1 ... 459 460 461 [ 462 ] 463 464 465 ... 469


Пакет UTL TCP 1809

60 l raw data raw(4096);

61 begin

62 simple tcp client.recv(g sock, l raw data);

63 return utl raw.cast to varchar2(l raw data);

64 end;

67 member function recv raw return raw

68 is

69 l raw data raw(4096);

70 begin

71 simple tcp client.recv(g sock, l raw data);

72 return l raw data;

73 end; 74

75 member function getline(p remove crlf in boolean default FALSE)

76 return varchar2

77 is

78 l raw data raw(4096);

79 begin

80 simple tcp client.getline(g sock, l raw data);

82 if (p remove crlf) then

83 return rtrim(

84 utl raw.cast to varchar2(l raw data), SocketType.crlf);

85 else

86 return utl raw.cast to varchar2(l raw data);

87 end if;

88 end;

90 member procedure initiate connection(p hostname in varchar2,

91 p portno in number)

92 is

93 l data varchar2(4069);

94 begin

95 - выполняется 10 попыток подключения и если ни одна из них не 9 6 - увенчается успехом, распространяется исключительная ситуация

-> в вызывающую среду

97 for i in 1 .. 10 loop

98 begin

99 g sock := simple tcp client.connect to(p hostname, p portno);

100 exit;

101 exception

102 when others then

103 if (i = 10) then raise; end if;

104 end;

105 end loop;

106 end;

Такое количество попыток выполняется того, чтобы избежать проблем с сообщениями типа server busy . Это необязательно, но скрывает от вызывающего ошибки,



1810 Приложение А

которые он получал бы слишком часто при обращении к загруженному Web-серверу или другой популярной службе.

108 member procedure close connection

109 is

110 begin

111 simple tcp client.disconnect(g sock);

112 g sock := NULL;

113 end;

115 end;

116 /

Type body created.

Как видите, тело типа состоит в основном из вспомогательных подпрограмм, упрощающих использование средств пакета SIMPLE TCP CLIENT. Кроме того, мы инкапсулировали средства пакета SIMPLE TCP CLIENT в объектный тип. Используя тип SocketType вместо стандартного пакета UTL TCP, можно реализовать блок кода для получения Web-страницы через промежуточный сервер:

tkyte@TKYTE816> declare

2 s SocketType := SocketType(null);

3 buffer varchar2(4096);

4 BEGIN

5 s.initiate connection(proxy-server, 80);

6 s.send(GET http: www.oracle.com/ HTTP/1.0SocketType.CRLF);

7 s.send(SocketType.CRLF);

9 loop

10 buffer := s.recv;

11 exit when buffer is null;

12 dbms output.put line(substr(buffer,l,255)) ;

13 end loop;

14 s.close connection;

15 END;

16 /

HTTP/1.1 2 00 OK

Date: Thu, 01 Feb 2001 00:16:05 GMT Server: Apache/1.3.9 (Unix) mod perl/1.21 ApacheJServ/1.1 yyyyyyyyyy: close

Content-Type: text/html

<head>

<title>Oracle Corporation</title>

Это код как будто не отличается принципиально от кода, использующего средства пакета UTL TCP, но показывает, как инкапсуляция пакетов в объектные типы создает приятное впечатление объектно-ориентированного программирования на PL/SQL. Тем, кто привык программировать на языках Java или С + + , будет очень удобно работать с



Пакет UTL TCP 1811

подобного рода кодом, объявляя тип SocketType и вызывая затем его методы. Это намного удобнее, чем объявлять переменную-запись определенного типа и передавать ее затем в каждую подпрограмму, как приходится делать при использовании пакета UTLTCP. Такая реализация - скорее объектно-ориентированная (в начале раздела бхла представлена чисто процедурная).

Резюме

В этом разделе мы рассмотрели новые возможности, предоставляемые пакетом UTL TCP. Вы также познакомились с альтернативной реализацией этих возможностей на языке Java. На их основе мы сформировали новый объектный тип для языка PL/SQL, обеспечивающий все необходимые средства работы с сокетом TCP/IP. Вы увидели, как легко с помощью этого типа включить средства работы с сетью в PL/SQL-приложения (в разделе, посвященном пакету UTL HTTP, б1ло показано, как на основе этого объектного типа обеспечить полную поддержку протокола HTTP).



1 ... 459 460 461 [ 462 ] 463 464 465 ... 469

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