Сервер переехал на новый сайт http://www.oraclegis.com/blog. Здесь идет ретрансляция

вторник, 16 декабря 2008 г.

Две новые статьи

Дошли руки. Написал 2 давно задуманные статьи:

1. Об интеграции Mapviewer с MS Virtual Earth
2. О поддержке системы координат World mercator (54004) в Oracle Spatial


Читать далее...

FAQ по Oracle Mapviewer

Недавно компания Oracle опубликовала FAQ по Mapviewer. Его русская версия доступна здесь.


Читать далее...

суббота, 13 декабря 2008 г.

OdiInvokeWebService tool is not working properly when using Designer with Java 1.6

It is not possible to invoke a Web Service with the OdiInvokeWebService tool when using Designer with Java 1.6. Invoking an operation throws the following exception :

java.lang.AbstractMethodError:
org.apache.crimson.tree.XmlDocument.getXmlStandalone()Z
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.setDocumentInfo(DOM2TO.jav a:373)
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:127)
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:94)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity (TransformerImpl.java:663)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:709)

и т.д.

Проблема решается установкой более ранней версии JDK (1.5) или upgradом на более новую версию ODI. Эта новая версия ODI либо 10.1.3.5, либо 11g :) А ее еще нет. По крайней мере я не нашел :))


Читать далее...

Отсутствует класс com.sunopsis.sdk.opentools.SnpsOpenToolAbstract

В Oracle Data integrator есть интересная возможность по расширую функциональности – OpenTool. Эта возможность позволяет на Java написать то, что еще не реализовано в ODI.

Достался этот функционал от старого доброго Sunopsis. Oracle потихоньку начал перекраивать функционал под свои нужды. Соответственно возникают коллизии. Вот на одну такую коллизию наткнулся. 

Я пытался запустить пример, поставляемый в дистрибутиве – SimpleMessageBox. Класс написан на старой версии Sunopsis и там же скомпилирован. В настоящий момент ряд классов переименованы – в частности такого класса как com.sunopsis.sdk.opentools.SnpsOpenToolAbstract не стало, а появился класс oracle.odi.sdk.opentools.OpenToolAbstract. Как результат – при попытке загрузить OpenTool из класса SimpleMessageBox получаем ошибку:

java.lang.NoClassDefFoundError: com/sunopsis/sdk/opentools/SnpsOpenToolAbstract
    Open Tool not acrivated. Your Open Tool references a class not found

Для того, чтобы решить проблему придется перекомпилировать класс SimpleMessageBox.

Для этого

1. Откроем файл $ODI_HOME/demo/plugins/src/com/myCompany/sunopsisOpenTools/SimpleMessageBox.java и делаем глобальную замену фразы "com.sunopsis.sdk.opentools" на фразу "oracle.odi.sdk.opentools". Кроме того, также глобальной заменой следует заменить "Snps" на "".

2. Компилируем класс SimpleMessageBox из каталога $ODI_HOME/demo/plugins/src/com/myCompany/sunopsisOpenTools/

/opt/jdk1.6.0_11/bin/javac –cp /u01/app/oracle/product/10.3.0.4/oracledi/lib/sunopsis.zip SimpleMessageBox.java

3. Копируем $ODI_HOME/demo/plugins/src/com/myCompany/sunopsisOpenTools/SimpleMessageBox.class в каталог $ODI_HOME/demo/plugins/bin/com/myCompany/sunopsisOpenTools/

Дальше можно делать по инструкции.


Читать далее...

среда, 3 декабря 2008 г.

Русский язык в параметрах JSP страниц (UTF-8, Windows-1251)

Борьба с детскими болезнями поддержки русского языка уже начинает надоедать. Связано это в первую очередь с исходной заточенностью многих технологий именно на ASCII символы, ну или, в крайнем случае, на западноевропейскую кодировку.

Очередная проблема с которой я столкнулся – это передача параметров на JSP страницу.

Начал я вот с такого куска кода JSP

<%@ page contentType="text/html;charset=UTF-8" %>
<% query2 = request.getParameter("query_1"); %>

<form action="jview1.jsp" name="jview" method="post">
query 2: <TEXTAREA style="font-size:28px;   font-family: arial, helvetica, sans-serif;" cols=40 name=query_2 rows=6><%=(query2!=null)?query2:""%></TEXTAREA>
</form>

Собственно, что может быть проще. Запостили страничку в UTF-8 с текстовым полем query_2, вытащили его из запроса и обратно затянули в это поле.

А вот и не просто. Вводим в поле текст следующего содержания

“select * from moscow where name='Город'”.

А в ответ получаем

“select * from moscow where name='Город'”.

Для решения этоq проблемы, в конце концов, пришел к вот такому коду (может не оптимальный и не универсальный, но в моем случае работает):

  String query1_temp = request.getParameter( "query_1" );
  query1 =query1_temp==null?null:new String(query1_temp.getBytes("ISO-8859-1"),response.getCharacterEncoding());

Если кто-то сделал по-другому – делитесь. :)


Читать далее...

четверг, 27 ноября 2008 г.

Листовки по Oracle Spatial, Locator и Mapviewer

Опубликованы новые листовки по Oracle Spatial, Locator, Mapviewer на русском языке.

Обзор возможностей Oracle Locator
Обзор возможностей Oracle Spatial
Обзор возможностей Mapviewer

Эти листовки также есть в печатном виде.


Читать далее...

вторник, 25 ноября 2008 г.

Импорт данных Navteq для Oracle Spatial

Как известно, компания Navteq – глобальный партнер Oracle и поставщик данных для Oracle. Главное их отличие от остальных поставщиков – это ориентированность в поставках именно на СУБД Oracle (http://solutions.oracle.com/partners/navteq). Аналогичное партнерство у Oracle существует и с компанией Teleatlas.

Компания Navteq поставляет данные в формате табличных пространств для Oracle. Это позволяет избежать утомительной загрузки данных из дампов.

Ниже я опишу процесс загрузки данных. Предварительно я скачал и распаковал партнерский пакет данных Navteq для Oracle. Пакет состоит из трех типов данных: карта, данные для маршрутизации и  данные для геокодирования. Пакет у меня за первый квартал 2008 года – общий объем 105 Гб.

Вот такой список файлов:

Тип данных Файлы Количество Объем данных
Карта MAP_EU_Q108_XX.ORA 8 штук (XX от 01 до 08) 30 Гб
Данные для маршутизации RC_EU_Q108_XX.ORA 18 штук (XX от 01 до 18) 45 Гб
Данные для геокодирования GC_EU_Q108_01.ORA 14 штук (XX от 01 до 14) 36 Гб

1. Предварительные требования

- Для использования этих данных необходима база данных Oracle Database Enterprise Edition with Spatial с версией минимум 10.2.0.3. Версия Oracle Database 11.1.0.6 работать не будет. Версия 11.1.0.7 работает нормально.

???? Перед заливкой данных проверьте параметр COMPATIBLE черех SQL plus:

???? SHOW parameter COMPATIBLE;

- NLS настройки должны быть следующими:

NLS_CHARACTERSET  AL32UTF8 
NLS_NCHAR_CHARACTERSET  AL16UTF16 

Желательно выставить NLS_LANG в значение AMERICAN_AMERICA.UTF8. Если значение у Вас другое, то стоит проконсультироваться с поддержкой.

- нужно понимание того, как работает технология Transportable Tablespaces. Эти знания можно почерпнуть в документации в разделе “8 Managing Tablespaces” в книге Oracle® Administrator's Guide 10g Release 2 (10.2) или аналогичной для 11-ой версии базы.

- поддерживаемое количество файлов db_files (файл параметров Oracle init.ora) должно быть достаточным. Полная инсталляция требует как видно из таблицы 30 файлов данных. Прибавьте сюда файлы уже имеющиеся в базе данных. Перед импортом данных нужно установить этог параметра в приемлимое значение

- набор данных от Navteq использует блок Oracle размером 8 кб. Ваша база должна быть с тем же размером блока. Посмотреть можно командой SHOW PARAMETER db_block_size. Если база имеет другой размер блока, то самое время почитать раздел “Setting the Buffer Cache Initialization Parameters” в книге Oracle® Administrator's Guide 10g Release 2 (10.2) о поддержке разных размеров блоков данных в Oracle.

- для Oracle Database 10g желательно установить патч 10.2.0.4 – это связано с рядом проблем с геокодирование и маршрутизацией.

2. Подготовка

2.1 Общая информация

Данные поставляются в 3-х табличных пространствах. Данные для каждого модуля Geocoding (GC), Route Calculation (RC), Map Display (MAP) лежат в свое табличном пространстве. Мы будем все импортировать в одну базу данных. Если нужно, чтобы данные загрузились не табличное пространство или пользователя по-умолчанию, то при импорте данных можно выполнить ремапинг. Для более подробной информации можно посмотреть документацию по impdp.

Имя пользователя для данных генерируется компанией Navteq по следующей схеме: <Prefix>_<Region>_<Quarter><Year>

Пример:

Набор данных для Европы (куда входит Россия) (EU) квартала Q1/2008 поставляется со следующими именами пользователя и табличных пространств
Пользователь = ODF_EU_Q108
Geocoding Tablespace = GC_EU_Q108
Routing Tablespace = RC_EU_Q108
Map Display Tablespace = MAP_EU_Q108

Имена регионов:

TTS Short Identifier Регион
EU Европа
NA Северная Америка
WM World Markets
MEX Мексика

Файлы данных имеют расширение “.ORA”. Файлы дампа имеет имя “.DMP”.

2.2. Создание пользователя-владельца пространственных данных.

GRANT CONNECT, CREATE TABLE, CREATE VIEW, CREATE ANY TABLE, CREATE
PROCEDURE, CREATE SEQUENCE, CREATE ANY INDEX TO <ODF User> IDENTIFIED BY
<ODF password>; 

Имя пользователя в <> нужно изменить на нужное. В моем случае для Европы в 1-ом квартале 2008 года было так:

GRANT CONNECT, CREATE TABLE, CREATE VIEW, CREATE ANY TABLE, CREATE
PROCEDURE, CREATE SEQUENCE, CREATE ANY INDEX TO ODF_EU_Q108  IDENTIFIED BY
oracle; 

2.3. Копирование, проверка и распаковка данных

Данные необходимо скопировать с DVD дисков. В результате получим структуру каталогов: data, doc, sql. В каталоге будет множество компрессированных файлов (*.gz). Нужно будет проверить их на целостность. Сделать это можно с помощью md5.

md5sum -c GC_digest.md5
md5sum -c MAP_digest.md5
md5sum -c RC_digest.md5

Файлы контрольных сумм должны лежать в том же каталоге, что и файлы (*.gz). В поставке Windows md5sum нет. Взять его можно, например, в cygwin.

Дале нужно распаковать все файлы

gzip -d *.gz

После распаковки Navteq рекомендует защить файлы от записи. У себя я сделал вот так

chmod -R u-w,o-w,g-w /u02/navteqdata/data

3. Загрузка данных (делается для каждого типа данных отдельно)

Загружать можно через Enterprise Manager, либо через impdp. В разделе 3.1 – через Enterprise Manager, в 3.2 – через impdp.

•  Войдите в Enterprise Manager Web Console (обычно адрес в 10-ке http://server:1158/em, в 11g https://server:1158/em)
•  Для Oracle Database 10g выбрать “Maintenance” –> “Data Movement” -> “Move Database Files” -> “Transport Tablespaces”. Для 11g “Data Movement” –> “Transport Tablespaces”
•  Выбрать “Integrate an existing transportable tablespace set”. Введите имя пользователя и пароль для операционной системы (для Windows: пользователь должен обладать правами Log on as Batch Job - подробнее здесь)
•  Шаг 1 (файлы): 
-  Выбрать имя файла  (*.DMP), вводите полный путь к файлу (у меня это файлы GC_EU_Q108.DMP, MAP_EU_Q108.DMPRC_EU_Q108.DMP). Пусть мы грузим данные для карты, т.е. файл MAP_EU_Q108.DMP
-  Выбрать формат файлов  “Datapump”
Добавьте файлы данных: Введите маску файлов, включая полный путь (например /u02/navteqdata/data/MAP*.ORA), затем нажмите “Add”
•  Шаг 2(местоположение файлов):
-  Для более быстрого импорта выберите  “Do not copy the datafiles”
•  Шаг 3 (Options):
-  Если необходимо провести ремаинг схем, то укажите из какой схемы в какую. Мы это делать не будем
-  Выберите “Put the transportable tablespaces into read/write mode”.
(Note: Если импорт пройдет с ошибкой, то tablespace останется в read-only и нужно будет вручную сделать его Read-Write)
•  Шаг 4 (Schedule): 
-  Укажите имя работы (по нему в будущем можно будет отследить состоянии импорта)
-  Выберите когда начинать импорт
•  Шаг 5 (Review): 
Проверитьте параметры
•  Нажмите Submit job.

4. Действия после загрузки

4.1. Если это не произошло автоматические переведите табличное пространство в режим Read Write.
ALTER TABLESPACE <TABLESPACE_NAME> READ WRITE;

4.2. Установите табличное пространство по-умолчанию для пользователя ODF

ALTER USER <ODF user> DEFAULT TABLESPACE <TABLESPACE_NAME>;
ALTER USER <ODF user> QUOTA UNLIMITED ON <TABLESPACE_NAME>;

4.3 Загрузите информацию о пространственных индексах.

Сделать это можно двумя способами – использовать уже построенные индексы транспортированные индексы (4.3.1), либо строить их с нуля (4.3.2). Первый вариант предпочтительнее

4.3.1. Загрузка индексов из TTS

- убедитесь, что табличное пространство в состоянии READ WRITE

- восстановите информацию об индексах (запускается из под ODF пользователя)

update SDO_INDEX_TTS_METADATA$
set SDO_INDEX_OWNER = '<YOUR_ODF_IMPORT_USER>';
commit;

у меня это было вот так

update SDO_INDEX_TTS_METADATA$
set SDO_INDEX_OWNER = 'ODF_EU_Q108';
commit;

Запустите SDO_UTIL.INITIALIZE_INDEXES_FOR_TTS();

- удалите таблицу SDO_INDEX_TTS_METADATA$ после загрузки подключившись под пользователем ODF
drop table SDO_INDEX_TTS_METADATA$;

4.3.2. Перестройка индексов с помощью скриптов SQL

- запустите sql/CF_Create_Procedures.sql
этот скрипт нужно запускать только один раз 

- для карты (MAP) запустите скрипты:
sql/xCreate_WOM_SDO.sql
sql/xNTC_Create_MapSDO.sql

- для Geocoding (GC) запуститет скрипт (вместо <GC_TABLESPACE> – укажите имя табличного пространства): 
sql/GC_CreateSpatialIndex.sql <GC_TABLESPACE>

- для маршрутизации (RC) запустите скрипт (вместо <GC_TABLESPACE> – укажите имя табличного пространства):   
sql/RC_CreateSpatialIndex.sql <RC_TABLESPACE>

!!! После каждого скрипта (MAP, GC, RC) нужно удалять таблицу SDO_INDEX_TTS_METADATA$

drop table SDO_INDEX_TTS_METADATA$;

 

Troubleshooting

1. Если получили вот такую ошибку

Import: Release 11.1.0.7.0 - Production on Monday, 24 November, 2008 8:45:45

Copyright (c) 2003, 2007, Oracle. All rights reserved.

Username:
Connected to: Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Master table "SYSTEM"."INTEGRATETTS000001" successfully loaded/unloaded
Starting "SYSTEM"."INTEGRATETTS000001": SYSTEM/******** dumpfile=MAP_EU_Q108.DMP
directory=EM_TTS_DIR_OBJECT transport_datafiles=/u02/navteqdata/data/MAP_EU_Q108_01.ORA
job_name=INTEGRATETTS000001 logfile=IMPORT.LOG
Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK
ORA-39123: Data Pump transportable tablespace job aborted
ORA-29345: cannot plug a tablespace into a database using an incompatible character set

Job "SYSTEM"."INTEGRATETTS000001" stopped due to fatal error at 08:46:03


то нужно будет создавать новую базу с соответствующей кодировкой – AL32UTF8  (см. предварительные требования). Если это неприемлимо, то придется создавать новую базу данных, импортировать туда данные, экспортировать и импортировать в целувую базу данных уже стандартными средствами. А вообще пора мигрировать в UTF8.



Читать далее...