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

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


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



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

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