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

1 ... 454 455 456 [ 457 ] 458 459 460 ... 469


1794

Приложение А

Теперь, когда у нас есть Java-класс, созданный для связи с языком PL/SQL, необходимо создать функцию связи, сопоставляющую PL/SQL-типы Java-типам и связывающуюся с Java-классом. Она создается следующим образом:

tkyte@TKYTE816> create or replace function send(

p from

varchar2,

P to

varchar2,

P cc

varchar2,

p bcc

varchar2,

p subject

varchar2,

p body

varchar2,

p smtp host

varchar2,

p attachment data

in blob.

p attachment type

in varchar2,

p attachment file name

in varchar2) return number

language java name mail.send(java.lang.String,

java.lang.String,

java.lang.String,

java.lang.String,

java.lang.String,

java.lang.String,

java.lang.String,

oracle.sql.BLOB,

java.lang.String,

java.lang.String

return oracle.sql.NUMBER;

Function created.

Последнее, что надо сделать, прежде чем использовать функцию, - убедиться, что пользователь (владелец класса mail и хранимой процедуры send) имеет достаточно привилегий для ее выполнения. Необходимые привилегии предоставляются следующим образом:

sys@TKYTE816> begin

2 dbms java.grant permission(

3 grantee => USER ,

4 permission type => java.util.PropertyPermission,

5 permission name => *,

6 permission action => read,write

7 ) ;

8 dbms java.grant permission(

9 grantee => USER ,

10 permission type => java.net.SocketPermission,

11 permission name => *,

12 permission action => connect,resolve

13 );

14 end;

15 /

PL/SQL procedure successfully completed.



Пакет UTL SMTP и отправка электронной почты

1795

Обратите внимание: предоставляя привилегии для java.net.SocketPermission, я указал звездочку (*) в качестве permission name. Это позволяет пользователю получать по имени IP-адрес и подключаться к хосту. Строго говоря, вы можете указать здесь только имя того SMTP-сервера, который будете использовать. Это будет минимально необходимая привилегия. Эта привилегия нужна, чтобы можно было получить lP-адрес по имени SMTP-хоста, а затем подключиться к нему. Другая привилегия, java.util.PropertyPermission, необходима для установки свойства сеанса mail.smtp.host.

Теперь все готово для проверки. Я использовал фрагмент кода из раздела, посвященного пакету DBMS LOB, где рассматривалась процедура load a file. Изменив ее и таблицу DEMO так, чтобы в ней был столбец типа BLOB вместо CLOB, я загрузил в таблицу файл mail8i.zip, в котором находится использованный нами класс. Теперь я могу использовать такой PL/SQL-блок для передачи самому себе из базы данных этого класса как вложения в сообщении электронной почты:

tkyte@TKYTE816>set serveroutput on size 1000000 tkyte@TKYTE816> exec dbms java.set output(1000000)

tkyte@TKYTE816> declare

2 3 4

10 11 12 13 14 15

17 18 19 20

22 23 24

ret code number; begin

for i in (select theBlob from demo) loop

ret code := send(

p from=> me@acme.com, p to -> you@acme.com,

p cc => NULL, p bcc => NULL, p subject => Use the attached Zip file, p body => to send email with attachments...., p smtp host = > yourserver.acme.com , p attachment data => i.theBlob, p attachment type => application/winzip, p attachment file name => mail8i.zip);

1 then

(Сообщее успешно послано...) ;

if ret code

dbms output.put line

else

dbms output.put line end if; end loop; end; /

(Сообщение послать не удалось...);

Successfully sentmessage...

PL/SQL procedure successfully completed.

При проверке, несомненно, необходимо выполнить команду set serverouput on и вызвать процедуру DBMS JAVA.SET OUTPUT. Причина в том, что сообщения об исключительных ситуациях в хранимых процедурах на языке Java выдаются в System.out и по умолчанию попадают в файл трассировки на сервере. Если вы хотите получать сообщения об ошибках в сеансе SQL*Plus, необходимо выполнить эти два действия. Это очень поможет при отладке.



1796

ПриложениеА

Резюме

В этом разделе мы кратко рассмотрели стандартный пакет UTL SMTP. Вы узнали, как посылать сообщения нескольким адресатам, явно формировать заголовки From: и Subject:. Этого достаточно для удовлетворения требований большинства пользователей к средствами передачи сообщений электронной почты из базы данных. Пакет UTL SMTP хорошо подходит для отправки простых, текстовых сообщений, но передача вложений или сложных, многосекционных сообщений выходит за пределы его возможностей (если только вы сами не сформируете тело сообщения). Если эти возможности необходимы, можно использовать средства JavaMail API. Поскольку компания Sun любезно предоставила необходимые для этого алгоритмы, мы просто воспользовались ее кодом. В этом разделе продемонстрировано не только, как посылать сообщения, но и какие побочные эффекты связаны с использованием Java в качестве альтернативного языка написания хранимых процедур. Теперь можно использовать общедоступный код и библиотеки классов. Можно обеспечить выполнение сервером многих действий, которые ранее б1ли невозможны. Разработчики языка PL/SQL в корпорации Oracle сами используют этот метод. Пакет UTL TCP в Oracle 8i построен на базе Java-функций.



1 ... 454 455 456 [ 457 ] 458 459 460 ... 469

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