Cервер Oracle

Download Report

Transcript Cервер Oracle

Cервер Oracle
Некоторые возможности интеграции
Сервер Oracle – некоторые возможности
интеграции

Работа с COM-объектами на сервере




Работа с функциями ОС сервера



Формирование документа MS-Excel
Формирование PDF документа
Как без COM?
Принципиальная схема работы
Пример выполнения команды ОС
Отправка e-mail (SMTP) с вложением
Работа с COM-объектами на сервере

Установка Oracle COM Automation Feature




Схема работы
Установка математического обеспечения
Конфигурирование служб Oracle Net
Настройка серверной части

Установка надстроек для работы с COM-серверами
MS Word, MS Excel, MS Power Point, MAPI

Документация
Работа с COM-объектами на сервере – Схема
работы
Экземпляр БД
Oracle Listener
Хранимые
PL/SQL
объекты
Oracle Net RPC
Обработчик
RPC
Oracle
COM Feature
Данные БД
Внешние COM
серверы
Область процессов экземпляра БД Oracle
COM/DCOM
Внешние проецессы
СЕРВЕР
Работа с COM-объектами на сервере –
Установка математического обеспечения
Работа с COM-объектами на сервере –
Конфигурирование служб Oracle Net
LISTENER.ORA
LISTENER =
(ADDRESS_LIST=
…
(ADDRESS = (PROTOCOL = IPC) (KEY = EXTPROC0) )
…
)
TNSNAMES.ORA
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC) (KEY = EXTPROC0))
(CONNECT_DATA = (SID = plsextproc)))
)
Работа с COM-объектами на сервере –
Настройка серверной части
Компиляция объектов Oracale COM Automation Feature
SQL> CONNECT PARUS/PARUSINA@DATABASE
SQL> @<ORACLE_HOME>\COM\COMWRAP.SQL
Работа с COM-объектами на сервере – Установка
надстроек для работы с COM-серверами MS Word, MS
Excel, MS Power Point, MAPI
Компиляция объектов надстроек для Excel, Word, PowerPoint, MAPI
SQL> CONNECT PARUS/PARUSINA@DATABASE
SQL> @<ORACLE_HOME>\COM\DEMOS\EXCELSOL.SQL
SQL> @<ORACLE_HOME>\COM\DEMOS\WORDSOL.SQL
SQL> @<ORACLE_HOME>\COM\DEMOS\PPTDSOL.SQL
SQL> @<ORACLE_HOME>\COM\DEMOS\MAPISOL.SQL
Работа с COM-объектами на сервере Документация

Oracle COM Automation Feature Developer's Guide


http://docs.oracle.com/cd/B19306_01/win.102/b14310/toc.htm
Oracle COM Automation PL/SQL Demos

http://docs.oracle.com/cd/B19306_01/win.102/b14310/ch4plsql.htm
Работа с COM-объектами на сервере –
Формирование документа MS-Excel
declare
N binary_integer := 2;
I binary_integer;
FILENAME varchar2(255);
CELLINDEX varchar2(40);
CELLCOLUMN varchar2(40);
begin
FILENAME := 'd:\excel';
I := ORDEXCEL.CREATEEXCELWORKSHEET('');
I := ORDEXCEL.INSERTDATA('A1', 'Номер', 'BSTR');
I := ORDEXCEL.INSERTDATA('B1', 'Мнемокод', 'BSTR');
I := ORDEXCEL.INSERTDATA('C1', 'Наименование', 'BSTR');
I := ORDEXCEL.INSERTDATA('D1', 'Сумма', 'BSTR');
for C1_REC in (select AG.AGNABBR, AG.AGNNAME from AGNLIST AG
where ROWNUM <= 10)
loop
CELLCOLUMN := TO_CHAR(N);
CELLINDEX := CONCAT('A', CELLCOLUMN);
I := ORDEXCEL.INSERTDATA(CELLINDEX, N, 'I2');
CELLINDEX := CONCAT('B', CELLCOLUMN);
I := ORDEXCEL.INSERTDATA(CELLINDEX, C1_REC.AGNABBR, 'BSTR');
CELLINDEX := CONCAT('C', CELLCOLUMN);
I := ORDEXCEL.INSERTDATA(CELLINDEX, C1_REC.AGNNAME, 'BSTR');
CELLINDEX := CONCAT('D', CELLCOLUMN);
I := ORDEXCEL.INSERTDATA(CELLINDEX, N, 'I2');
N := N + 1;
end loop;
I := ORDEXCEL.INSERTCHART(350, 200, 250, 250, 'D2:D15', 'xlPie');
select FILENAME||TO_CHAR(sysdate, 'HH24MISS') into FILENAME from DUAL;
I := ORDEXCEL.SAVEEXCELFILE(FILENAME);
I := ORDEXCEL.EXITEXCEL();
end;
Работа с COM-объектами на сервере –
Формирование документа PDF

Apache FOP (Formatting Objects Processor) + XSL
Formatting Objects (XSL-FO)


http://xmlgraphics.apache.org/fop/
PL/PDF

http://www.plpdf.com/plpdf-sdk.html
Работа с COM-объектами на сервере – Как без
COM?

XML - XLS

http://msdn.microsoft.com/ru-ru/office/aa905546.aspx
Работа с COM-объектами на сервере – Как без
COM?

POI-HSSF (Poor Obfuscation Implementation Horrible SpreadSheet Format) и POI-XSSF
(Poor Obfuscation Implementation – XML
SpreadSheet Format)


http://poi.apache.org/spreadsheet/index.html
Java Excel API

http://jexcelapi.sourceforge.net/
Работа с функциями ОС сервера –
Принципиальная схема работы
Экземпляр БД
Java Class
PL/SQL-обёртка
Oracle
JVM
ОС
Прикладные
PL/SQL объекты
Область процессов экземпляра БД Oracle
Внешние проецессы
СЕРВЕР
Работа с функциями ОС сервера – Пример
выполнения команды ОС
create or replace and compile java source named "OsUtils" as
import java.io.IOException;
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
class StreamGobbler
extends Thread {
InputStream is;
String type;
StreamGobbler (InputStream is, String type) {
this.is = is; this.type = type;
}
public void run () {
try {
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) OsUtils.result.append(line).append("\n");
} catch (IOException ioe) {ioe.printStackTrace();}
}
}
public class OsUtils {
public static StringBuffer result;
public static int runCommand (String command)
throws Throwable {
result = new StringBuffer(); Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(command);
StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream(), "ERROR");
StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream(), "OUTPUT");
errorGobbler.start(); outputGobbler.start();
proc.waitFor(); return proc.exitValue();
}
}
1. Java Class, выполняющий
команду операционной
системы
runCommand
Экспортируемая функция интерфейса класса
Runtime.getRuntime()
Runtime.exec(<КОМАНДА ОС>)
Работа с функциями ОС сервера – Пример
выполнения команды ОС
create or replace function udo_f_run_os_command (p_cmd in varchar2) return number as
language java name 'OsUtils.runCommand (java.lang.String) return int';
declare
result number;
begin
result := udo_f_run_os_command('C:\WINNT\system32\cmd.exe /c dir');
end;
exec dbms_java.grant_permission(user,
'SYS:java.io.FilePermission',
'C:\WINNT\system32\cmd.exe', 'execute' );
2. PL/SQL-обёртка
3. Использование для
прикладных целей
4. Назначение
дополнительных прав
доступа
Отправка E-Mail (SMTP) с вложением
conn:=utl_smtp.open_connection(MAIL_SERVER, MAIL_PORT);
utl_smtp.ehlo(conn, MAIL_SERVER);
utl_smtp.command(conn, 'AUTH LOGIN');
utl_smtp.command(conn, utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(MAIL_USER))));
utl_smtp.command(conn, utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(MAIL_USER_PASS))));
utl_smtp.mail(conn, MAIL_SENDER);
utl_smtp.open_data(conn);
write_mime_header(conn, 'To', MAIL_RECIVIER); write_mime_header(conn, 'Subject', MAIL_SUBJECT);
write_mime_header(conn, 'Sender', MAIL_SENDER); write_mime_header(conn, 'From', MAIL_SENDER);
write_mime_header(conn, 'Content-Language', 'ru'); write_mime_header(conn, 'Content-Type', 'text/plain; charset=Windows-1251');
write_mime_header(conn, 'Content-Transfer-Encoding', '8bit');
utl_smtp.write_data(conn, utl_tcp.crlf);
utl_smtp.write_raw_data(conn, utl_raw.cast_to_raw(MESSAGE));
utl_smtp.write_data(conn, utl_tcp.crlf); utl_smtp.write_data(conn, utl_tcp.crlf);
utl_smtp.write_data(v_Mail_Conn, '--'|| MAIL_SEPARATOR || utl_tcp.crlf );
utl_smtp.write_data(conn, 'Content-Type: '||ATT_MIME_TYPE||';'|| utl_tcp.crlf );
utl_smtp.write_data(conn, ' name="'||ATT_NAME||'"'|| crlf );
utl_smtp.write_data(conn, 'Content-Transfer-Encoding: base64'|| utl_tcp.crlf );
utl_smtp.write_data(conn, 'Content-Disposition: attachment;'|| utl_tcp.crlf );
utl_smtp.write_data(conn, ' filename="'||ATT_FILE_NAME||'"' || utl_tcp.crlf);
utl_smtp.write_data(conn, crlf );
ps:=1;
LOOP
BEGIN
dbms_lob.read(ATT_BLOB_DATA, 48, ps, att_raw_data);
ps := ps + 48;
utl_smtp.write_raw_data(conn, utl_encode.base64_encode(att_raw_data));
EXCEPTION
WHEN no_data_found THEN
EXIT;
END;
END LOOP;
utl_smtp.write_data(conn, '--' || MAIL_SEPARATOR || '--');
utl_smtp.write_data(conn, crlf ); utl_smtp.write_data(conn, crlf );
utl_smtp.close_data(conn);
utl_smtp.rset(conn);
utl_smtp.quit(conn);
Примеры применения
1. Эмуляция сервера печати для формирования “тяжелых” отчетов
(Пользовательская процедура Парус 8 + DBMS_JOB, DB Scheduler + ORDExcel + PrNotifier)
create procedure UDO_P_START_PRINTING
as
NJOB binary_integer;
begin
dbms_job.submit(job => NJOB
,what => 'begin UDO_P_DO_PRINTING; end;');
end;
create procedure UDO_P_DO_PRINTING
as
begin
I := ORDEXCEL.CREATEEXCELWORKSHEET('');
I := ORDEXCEL.INSERTDATA('A1', 'Номер', 'BSTR');
I := ORDEXCEL.SAVEEXCELFILE(FILENAME);
I := ORDEXCEL.EXITEXCEL();
...
P_NOTQUEUE_BASE_INSERT(nMSG_ID => GEN_ID
,nADDR_COMPANY => GET_SESSION_COMPANY
,sADDR_USER => ...
);
end;
Примеры применения
2. Автоматическая рассылка отчетности
(DBMS_JOB, DB Scheduler + ORDExcel + UTL_SMTP)
3. Ускорение печати “тяжелых отчетов”
(XML – XLS, ORDExcel)
4. Реализация конвертеров
(Исполнение команд ОС (UDO_F_RUN_OS_COMMAND) + UTL_FILE + PL/SQL + Парус 8 API)
Спасибо
Ваши вопросы