|
Программирование >> Oracle
1806 Приложее А 43 l data long; 44 begin 45 getline i(p sock, l data); 46 p data := utl raw.cast to raw(l data); 47 end getline; Аналогично рассмотренным выше процедурам RECV I/RECV, GETLINE I - внутренняя процедура, вызываемая только процедурой GETLINE. Внешний интерфейс PL/SQL представляет все данные как данные типа RAW, и функция GETLINE просто приводит данные типа VARCHAR2 к типу RAW. 49 procedure disconnect(p sock in number) 50 as language java 51 name jsock.java disconnect(int); 52 53 procedure get gmt(p gmt out varchar2) 54 as language java 55 name jsock.java get gmt(java.lang.String[]); 57 procedure get timezone(p timezone out varchar2) 58 as language java 59 name jsock.java get timezone(java.lang.String[]); 61 procedure get hostname(p hostname out varchar2) 62 as language java 63 name jsock.java get hostname(java.lang.String[]); 65 function peek(p sock in number) return number 66 as language java 67 name jsock.java peek sock(int) return int; 69 procedure b64encode(p data in raw, p result out varchar2) 70 as language java 71 name jsock.b64encode(byte[], java.lang.String[]); 72 end; 73 / Package body created. Теперь можно протестировать процедуры, чтобы убедиться в их работоспособности: tkyte@TKYTE816> declare 2 l hostname varchar2(2 55) ; 3 l gmt varchar2(2 55) ; 4 l tz varchar2(2 55) ; 5 begin 6 simple tcp client.get hostname(l hostname); 7 simple tcp client.get gmt (l gmt) ; 8 simple tcp client.get timezone(l tz); 10 dbms output.put line(hostname l hostname); 11 dbms output.put line(gmt time l gmt); Пакет UTL TCP 1807 12 dbms output.put line(timezone l tz); 13 end; 14 / hostname tkyte-dell gmt time 20010131 213415 GMT timezone EST PL/SQL procedure successfully completed. При использовании в базе данных компонентов этого пакета, связанных с протоколом TCP/IP, важно учитывать, что для этого необходимы соответствующие привилегии. Подробнее о пакете DBMS JAVA и привилегиях, связанных с использованием Java, можно прочитать в разделе приложения А, посвященном пакету DBMS JAVA. В данном случае необходимо выполнить: s@TKYTE816> begin 2 dbms java.grant permission( 3 grantee => TKYTE, 4 permission type => java.net.SocketPermission, 5 permission name => *, 6 permission action=> connect,resolve) ; 7 end; PL/SQL procedure successfully completed. Подробнее о том, как и почему работает эта процедура, см. в разделе, посвященном пакету DBMS JAVA. Если коротко, она позволяет пользователю TKYTE создавать подключения и получать по именам хостов IP-адреса (вот почему передано значение *). Если вы работаете с версией Oracle 8.1.5, пакета DBMS JAVAy вас нет. В этой версии придется предоставить владельцу jsock привилегию JAVASYSPRIV. Учтите, что привилегия JAVASYSPRIV дает слишком широкие полномочия. Тогда как вызов DBMS JAVA.GRANT PERMISSION позволяет установить привилегию очень точно, привилегия JAVASYSPRIV предполагает широкий набор привилегий. Теперь, когда необходимые привилегии получены, можно создавать и тестировать тип SocketType, аналогично тому, как тестировался пакет UTL TCP. Ниже представлено тело типа SocketType. Тело типа содержит очень немного кода - это просто оболочка для созданного пакета SIMPLE TCP CLIENT. Она скрывает сокеты от вызывающего: tkyte@TKYTE816>create or replace type body SocketType 2 as 4 static function crlf return varchar2 5 is 6 begin 7 return chr(13)chr(10); 8 end; 10 member function peek return number 11 is 12 begin 13 return simple tcp client.peek(g sock); 1808 Приложение А 14 end; 17 member procedure send(p data in varchar2) 18 is 19 begin 20 simple tcp client.send(g sock, utl raw.cast to raw(p data)) ; 21 end; 23 member procedure send raw(p data in raw) 24 is 25 begin 26 simple tcp client.send(g sock, p data) ; 27 end; 29 member procedure send(p data in clob) 30 is 31 l offset number default 1; 32 l length number default dbms lob.getlength(p data); 33 l amt number default 4096; 34 begin 35 loop 36 exit when l offset > l length; 37 simple tcp client.send(g sock, 38 utl raw.cast to raw( 39 dbms lob.substr(p data,l amt,l offset))); 40 l offset := l offset + l amt; 41 end loop; 42 end; Процедура SEND - перегруженная и поддерживает параметры различных типов, в том числе данные типа CLOB произвольной длины. Для передачи она разбивает объект типа CLOB на 4-килобайтовые фрагменты. Представленная ниже процедура SEND RAW работает аналогично, но с данными типа BLOB: 44 member procedure send raw(p data in blob) 45 is 46 l offset number default 1; 47 l length number default dbms lob.getlength(p data); 48 l amt number default 4096; 49 begin 50 loop 51 exit when l offset > l length; 52 simple tcp client.send (g sock, 53 dbms lob.substr(p data,l amt,l offset)); 54 l offset := l offset + l amt; 55 end loop; 56 end; 57 58 member function recv return varchar2 59 is
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |