200 likes | 421 Views
C ервер Oracle. Некоторые возможности интеграции. Сервер Oracle – некоторые возможности интеграции. Работа с COM- объектами на сервере Формирование документа MS-Excel Формирование PDF документа Как без COM? Работа с функциями ОС сервера Принципиальная схема работы
E N D
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 Внешние проецессы Oracle Listener Экземпляр БД Хранимые PL/SQL объекты Oracle Net RPC Обработчик RPC Данные БД Oracle COM Feature Внешние COM серверы 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 whereROWNUM <= 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;endloop; 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 (PoorObfuscationImplementation - HorribleSpreadSheet Format) и POI-XSSF (PoorObfuscationImplementation – XML SpreadSheet Format) • http://poi.apache.org/spreadsheet/index.html • Java Excel API • http://jexcelapi.sourceforge.net/
Работа с функциями ОС сервера – Принципиальная схема работы СЕРВЕР Область процессов экземпляра БД Oracle Внешние проецессы Экземпляр БД PL/SQL-обёртка Java Class ОС Oracle JVM Прикладные PL/SQL объекты
Работа с функциями ОС сервера – Пример выполнения команды ОС create or replace and compile java source named "OsUtils" as importjava.io.IOException; importjava.io.InputStream; importjava.io.BufferedReader; importjava.io.IOException; importjava.io.InputStream; importjava.io.InputStreamReader; classStreamGobbler extends Thread { InputStream is; String type; StreamGobbler (InputStream is, String type) { this.is = is; this.type = type; } publicvoid run () { try { InputStreamReaderisr = newInputStreamReader(is); BufferedReaderbr = newBufferedReader(isr); String line; while ((line = br.readLine()) != null) OsUtils.result.append(line).append("\n"); } catch (IOExceptionioe) {ioe.printStackTrace();} } } publicclassOsUtils { publicstaticStringBuffer result; publicstaticintrunCommand (String command) throwsThrowable { result = newStringBuffer(); Runtime rt = Runtime.getRuntime(); Process proc = rt.exec(command); StreamGobblererrorGobbler = newStreamGobbler(proc.getErrorStream(), "ERROR"); StreamGobbleroutputGobbler = newStreamGobbler(proc.getInputStream(), "OUTPUT"); errorGobbler.start(); outputGobbler.start(); proc.waitFor(); returnproc.exitValue(); } } 1. Java Class, выполняющий команду операционной системы runCommand Экспортируемая функция интерфейса класса Runtime.getRuntime() Runtime.exec(<КОМАНДА ОС>)
Работа с функциями ОС сервера – Пример выполнения команды ОС create or replace function udo_f_run_os_command (p_cmd in varchar2) return number aslanguage java name 'OsUtils.runCommand (java.lang.String) return int'; 2. PL/SQL-обёртка declareresultnumber;beginresult := udo_f_run_os_command('C:\WINNT\system32\cmd.exe /c dir');end; 3. Использование для прикладных целей exec dbms_java.grant_permission(user, 'SYS:java.io.FilePermission', 'C:\WINNT\system32\cmd.exe', 'execute' ); 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 BEGINdbms_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));EXCEPTIONWHENno_data_foundTHENEXIT;END;ENDLOOP;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) createprocedure UDO_P_START_PRINTINGas NJOB binary_integer;begindbms_job.submit(job => NJOB ,what => 'begin UDO_P_DO_PRINTING; end;');end; createprocedure UDO_P_DO_PRINTINGasbegin 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)
Спасибо Ваши вопросы