|
Программирование >> Oracle
Пакет 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).
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |