Первая часть моих приключений с Tibero тут
Для тестирования совместимости Tibero c Oracle я решил проверить, будут ли работать на нем любимые мною PL/SQL библиотеки, а именно:
https://github.com/mortenbra/alexandria-plsql-utils/
Тестирование началось с JSON_UTIL_PKG. Очень полезная функция позволяющая быстро генерировать JSON-ответ.
и так, делаем
Для упрощения жизни в начало pkb файла добавляем
types.sql установились удачно.
При установке пакета мы неожиданно натыкаемся на проблемы. Если в oracle установка этих трех файлов прошла гладко с получением скомпилированного пакета, то в случае с tibero при заливке тела пакета я получил такой вывод:
Вызвав
Получаю ошибку
Получается, что пакета dbms_xmlgen в tibero нет. Столкнувшись с этой проблемой я решил посмотреть какие вообще есть пакеты DBMS%. Запрос
Получил следующий список:
Итого 45 против 195 в моей версии oracle. Выглядит грустно. Из тех пакетов, что мне в Oracle приходилось использовать расстраивает отсутствие DBMS_SCHEDULER, DBMS_XMLDOM и т.д..
Я думаю, что многие в списке 150 не попавших в tibero dbmsов найдут не хватающие им пакеты.
Но что самое интересное: пакет dbms_xmlgen, из-за которого была ошибка, в Tibero присутствует. Проблема же оказалась в том, что в пакете нет функции setmaxrows.
Сделав
Получил такое наполнение пакета в Tibero
Как из вышесказанного видно, у Tibero меньше не только пакетов, но и процедур внутри них. Получается, что скорее всего миграция готового Oracle продукта на Tibero будет достаточно тяжелой, так как велик шанс, что пакеты использующие стандартные пакеты Oracle не cкомпилируются и их придется переписывать, либо самостоятельно реализовывать стандартные Oracle пакеты.
Получив такой результат я решил более детально изучить еще два пакета: DBMS_LOB и DBMS_LOCK. Они были выбраны потому что они мне кажутся самыми популярными у PL/SQL разработчиков.
DBMS_LOB.
Сравнение показало, что все основные функции присутствуют, но в Tibero c фрагментами работать нельзя, c DBFS_LINK’ами тоже, да и некоторых удобных методов тоже нет. Если говорить сухо, то пакет DBMS_LOB в tibero не содержит следующие методы:
DBMS_LOCK же реализован полностью.
С пакетами UTL_% ситуация близка к DBMS_%. Всего в Tibero представлено 11 пакетов. Из которых 8 (UTL_ENCODE, UTL_FILE, UTL_HTTP, UTL_I18N, UTL_MATCH, UTL_RAW, UTL_TCP, UTL_URL ) похожи на стандартные пакеты Oracle, оставшиеся три — свои собственные. У Oracle в свою очередь пакетов 21, тем самым в Tibero не реализованы следующие 13 пакетов:
Интересно, почему Tibero так не любит XML…
Состояние библиотек не очень оптимистичное. Но не всегда же мы используем DBMS и UTL пакеты! Иногда хватает стандартных функций, а с ними все более-менее оптимистично. TMax активно расширяет список поддерживаемых функций и сейчас стабильно поддерживает следующий список методов:
Математика
Строки
Даты
Служебные
Если мы сделаем запрос в all_procedures, то увидим еще функции, но в официальной документации они не упоминаются.
После полученных выше результатов я решил, что загружать сложные пакеты не имеет смысла: скорее всего проблемы будут похожими и будут упираться в нехватку тех или иных пакетов. Но бывают же и простые системы, которые легко обходятся без DBMS пакетов и сложных функций Я решил попробовать оценить с какими проблемами можно столкнуться при переносе таких систем. Для этого я взял Example схему HR.
Она была взята отсюда:
http://www.oracle.com/technetwork/developer-tools/datamodeler/hr-30-ddl-246035.zip
Исполнение этого скрипта выявило не полную поддержу ddl от Oracle.
Проблема №1
Выдает ошибку:
В документации подробностей, как можно это задать я не нашел. Но судя по тестам оно работает в соответствии с значением DEFERRABLE. Но и с ним нюансы ( см. проблему 2 )
Проблема №2
Выдает ошибку:
Опять таки документации по созданию constraint'ов я не нашел, но на практике, если мы хотим отложенные ограничения, то мы пишем DEFERRABLE, если же мы хотим всегда проверять это ограничение, то не указываем ничего (это значение по умолчанию).
Схема создана, теперь можно и прогнать скрипты для тестирования возможностей СУБД. Скрипты я взял от сюда:
http://www.srikanthtechnologies.com/oracle/dec9/hrqueries.html
Проблема №3
Запрос:
Дает ошибку:
Корректным для Tibero был такой запрос:
Эта мелочь мне кажется проблемой из-за того, что компания заявляет, что одной из главных направлений их развития является совместимость с Oracle. А совместимость — это не только поддержка качественного кода, но и корректная работа плохого кода. И когда что-то по умолчанию работает в Oracle, то при такой политике логично ожидать работы этого по умолчанию и в Tibero.
Других ошибок из этих скриптов мне получить не удалось. Отдельно проверил pivot, различные нотации join, иерархические запросы: все работает, странно работают pipeline функции и все, что с ними связано. Вот, простой пример:
Проблема №4
Создаю типы
Создаю функцию выдающую таблицу
Делаю запрос:
Получил:
Попытался исправить положение:
Результат еще хуже:
Но это производитель божится вот-вот исправить, но пока имеем то, что имеем.
Проблема №5
Подключение менеджеров базы данных. Это целая проблема и пляски с бубнами. Большинство общаться с базой не хочет или же настройка крайне не очевидная. Производитель обещает вот-вот будет tbrliboci.dll, но пока его нет.
Проблема №6
Попытался Oracle Forms 9 подключить к Tibero. Получил ошибку контрольной суммы при подключении. Дальше продвинуться не удалось.
Проблема №7
Мне оказалось достаточно мучительно пользоваться Explain Plan без dbms_xplan.display .
По итогам тестов, загрузки готовых пакетов и некоторых готовых PL/SQL систем могу сказать, что достаточно простые и легкие системы переносятся хорошо. Все работает, никаких проблем не возникает. Писать на ней с 0 можно и, наверное, вполне успешно. Если, конечно знаешь английский и готов терпеть, что что-то работает на так как в Oracle. В случае же больших систем, как интернет магазин, абс банка, складские систему учета, проблемы наличия пакетов, плохой работы с pipeline делают процесс миграции мучительным и сопряженным с переписыванием готового кода, что не очень приятно и иногда достаточно затратно.
В-целом мне кажется, что у этого продукта есть шанс на выживание. И сейчас уже, как я говорил в первой части есть российские компании, которые с ним работают. Работают там наши парни, а толковой информации на русском языке нет. Поэтому очень хочется, чтобы вокруг данного продукта начало создаваться русскоязычное сообщество людей, которые могут подсказать, помочь или поделиться опытом работы с этой субд Tibero.
P.S. Большой спасибо Петру Житникову за помощь в написании.
Для тестирования совместимости Tibero c Oracle я решил проверить, будут ли работать на нем любимые мною PL/SQL библиотеки, а именно:
https://github.com/mortenbra/alexandria-plsql-utils/
Тестирование началось с JSON_UTIL_PKG. Очень полезная функция позволяющая быстро генерировать JSON-ответ.
и так, делаем
wget https://raw.githubusercontent.com/mortenbra/alexandria-plsql-utils/2213e3df2f24a00322239d442c54bf31039f2588/setup/types.sql
wget https://raw.githubusercontent.com/mortenbra/alexandria-plsql-utils/master/ora/json_util_pkg.pks
wget https://raw.githubusercontent.com/mortenbra/alexandria-plsql-utils/master/ora/json_util_pkg.pkb
Для упрощения жизни в начало pkb файла добавляем
set define off
types.sql установились удачно.
При установке пакета мы неожиданно натыкаемся на проблемы. Если в oracle установка этих трех файлов прошла гладко с получением скомпилированного пакета, то в случае с tibero при заливке тела пакета я получил такой вывод:
tbsql sys/syspass @json_util_pkg.pkb
tbSQL 5 SP1
TmaxData Corporation Copyright (c) 2008-. All rights reserved.
Connected to Tibero.
Warning: PACKAGE BODY created with compilation errors.
File finished.
Вызвав
show errors
Получаю ошибку
TBR-15046: Identifier is out of scope.
at line 251, column 5:
dbms_xmlgen
Получается, что пакета dbms_xmlgen в tibero нет. Столкнувшись с этой проблемой я решил посмотреть какие вообще есть пакеты DBMS%. Запрос
select distinct name from all_source where name like 'DBMS%' order by 1
Получил следующий список:
DBMS_APM | DBMS_APM_INTERNAL | DBMS_APPLICATION_INFO | DBMS_CRYPTO |
DBMS_DEBUG | DBMS_DEBUG_JDWP | DBMS_ERRLOG | DBMS_EXPRESSION |
DBMS_FLASHBACK | DBMS_GEOM | DBMS_JAVA | DBMS_JOB |
DBMS_JOB_WITH_NAME | DBMS_JOB_WITH_NAME_INTERNAL | DBMS_LOB | DBMS_LOCK |
DBMS_METADATA | DBMS_MVIEW | DBMS_MVIEW_REFRESH_UTIL | DBMS_MVIEW_UTIL |
DBMS_OBFUSCATION_TOOLKIT | DBMS_OUTPUT | DBMS_PIPE | DBMS_RANDOM |
DBMS_REDEFINITION | DBMS_REDEFINITION_STATS | DBMS_REPAIR | DBMS_RESULT_CACHE |
DBMS_ROWID | DBMS_SESSION | DBMS_SPACE | DBMS_SPACE_ADMIN |
DBMS_SPH | DBMS_SPH_INTERNAL | DBMS_SQL | DBMS_STATS |
DBMS_STATS_INTERNAL | DBMS_STATS_UTIL | DBMS_SYSTEM | DBMS_TRANSACTION |
DBMS_TYPES | DBMS_UTILITY | DBMS_VERIFY | DBMS_XMLGEN |
DBMS_XPLAN |
Итого 45 против 195 в моей версии oracle. Выглядит грустно. Из тех пакетов, что мне в Oracle приходилось использовать расстраивает отсутствие DBMS_SCHEDULER, DBMS_XMLDOM и т.д..
Я думаю, что многие в списке 150 не попавших в tibero dbmsов найдут не хватающие им пакеты.
Но что самое интересное: пакет dbms_xmlgen, из-за которого была ошибка, в Tibero присутствует. Проблема же оказалась в том, что в пакете нет функции setmaxrows.
Сделав
desc dbms_xmlgen
Получил такое наполнение пакета в Tibero
FUNCTION CONVERT( XMLDATA IN VARCHAR, FLAG IN NUMBER ) RETURNS VARCHAR |
FUNCTION CONVERT( XMLDATA IN CLOB, FLAG IN NUMBER ) RETURNS CLOB |
FUNCTION NEWCONTEXT( QUERY IN VARCHAR ) RETURNS NUMBER |
FUNCTION NEWCONTEXT( QUERY IN REF CURSOR ) RETURNS NUMBER |
PROCEDURE SETNULLHANDLING( CTX IN NUMBER, FLAG IN NUMBER ) |
PROCEDURE CLOSECONTEXT( CTX IN NUMBER ) |
FUNCTION GETXML( CTX IN NUMBER, DTDORSCHEMA IN NUMBER) RETURNS CLOB |
FUNCTION GETXML( SQLQUERY IN VARCHAR, DTDORSCHEMA IN NUMBER ) IN RETURNS CLOB |
PROCEDURE GETXML( CTX IN NUMBER, TMPCLOB IN OUT CLOB, DTDORSCHEMA IN NUMBER ) |
Как из вышесказанного видно, у Tibero меньше не только пакетов, но и процедур внутри них. Получается, что скорее всего миграция готового Oracle продукта на Tibero будет достаточно тяжелой, так как велик шанс, что пакеты использующие стандартные пакеты Oracle не cкомпилируются и их придется переписывать, либо самостоятельно реализовывать стандартные Oracle пакеты.
Получив такой результат я решил более детально изучить еще два пакета: DBMS_LOB и DBMS_LOCK. Они были выбраны потому что они мне кажутся самыми популярными у PL/SQL разработчиков.
DBMS_LOB.
Сравнение показало, что все основные функции присутствуют, но в Tibero c фрагментами работать нельзя, c DBFS_LINK’ами тоже, да и некоторых удобных методов тоже нет. Если говорить сухо, то пакет DBMS_LOB в tibero не содержит следующие методы:
COPY_DBFS_LINK | COPY_FROM_DBFS_LINK | DBFS_LINK_GENERATE_PATH | FRAGMENT_DELETE |
FRAGMENT_INSERT | FRAGMENT_MOVE | FRAGMENT_REPLACE | GETCHUNKSIZE |
GETCONTENTTYPE | GETOPTIONS | GET_DBFS_LINK | GET_DBFS_LINK_STATE |
GET_DEDUPLICATE_REGIONS | GET_STORAGE_LIMIT | ISSECUREFILE | LOADBLOBFROMFILE |
LOADCLOBFROMFILE | LOADFROMFILE | MOVE_TO_DBFS_LINK | SETCONTENTTYPE |
SETOPTIONS | SET_DBFS_LINK |
DBMS_LOCK же реализован полностью.
С пакетами UTL_% ситуация близка к DBMS_%. Всего в Tibero представлено 11 пакетов. Из которых 8 (UTL_ENCODE, UTL_FILE, UTL_HTTP, UTL_I18N, UTL_MATCH, UTL_RAW, UTL_TCP, UTL_URL ) похожи на стандартные пакеты Oracle, оставшиеся три — свои собственные. У Oracle в свою очередь пакетов 21, тем самым в Tibero не реализованы следующие 13 пакетов:
UTL_CALL_STACK | UTL_COLL | UTL_COMPRESS | UTL_GDK |
UTL_IDENT | UTL_INADDR | UTL_LMS | UTL_NLA |
UTL_RECOMP | UTL_REF | UTL_SMTP | UTL_SYS_COMPRESS |
UTL_XML |
Интересно, почему Tibero так не любит XML…
Состояние библиотек не очень оптимистичное. Но не всегда же мы используем DBMS и UTL пакеты! Иногда хватает стандартных функций, а с ними все более-менее оптимистично. TMax активно расширяет список поддерживаемых функций и сейчас стабильно поддерживает следующий список методов:
Математика
ABS | ACOS | ASIN | ATAN | ATAN2 |
AVG | BITAND | CEIL | COS | COSH |
COUNT | EXP | FLOOR | LN | LOG(M,N) |
MOD | POWER | ROUND | SIGN | SIN |
SINH | SQRT | TAN | TANH | TRUNC |
Строки
CONCAT | CHR | LOWER | UPPER | LPAD |
LTRIM | RTRIM | RPAD | SUBSTR | REPLACE |
INITCAP | NLS_INITCAP | NLS_SORT | TRANSLATE | TO_CHAR |
ASCII | INSTR | LENGTH | LENGTHB |
Даты
+integer | -date | ADD_MONTHS | CURRENT_DATE |
CURRENT_TIME | CURRENT_TIMESTAMP | LAST_DAY | NEW_TIME |
NEXT_DAY | ROUND | TRUNC | EXTRACT |
SYSTIMESTAMP | MONTHS_BETWEEN | TO_CHAR | TO_NUMBER |
TO_DATE | TO_DSINTERVAL | SYSDATE |
Служебные
GREATEST | LEAST | CAST | CONVERT |
HEXTOCHAR | ROWIDTOCHAR | TO_CLOB | TO_LOB |
DECODE | DUMP | VSIZE | COALEASE |
LNNVL | NULLIF | NVL | NVL2 |
Если мы сделаем запрос в all_procedures, то увидим еще функции, но в официальной документации они не упоминаются.
После полученных выше результатов я решил, что загружать сложные пакеты не имеет смысла: скорее всего проблемы будут похожими и будут упираться в нехватку тех или иных пакетов. Но бывают же и простые системы, которые легко обходятся без DBMS пакетов и сложных функций Я решил попробовать оценить с какими проблемами можно столкнуться при переносе таких систем. Для этого я взял Example схему HR.
Она была взята отсюда:
http://www.oracle.com/technetwork/developer-tools/datamodeler/hr-30-ddl-246035.zip
Исполнение этого скрипта выявило не полную поддержу ddl от Oracle.
Проблема №1
ALTER TABLE JOB_HISTORY
ADD CONSTRAINT JHIST_DATE_CHECK
CHECK (end_date > start_date)
INITIALLY IMMEDIATE
ENABLE
VALIDATE
;
Выдает ошибку:
TBR-7001: General syntax error.
at line 4, column 9:
INITIALLY IMMEDIATE
В документации подробностей, как можно это задать я не нашел. Но судя по тестам оно работает в соответствии с значением DEFERRABLE. Но и с ним нюансы ( см. проблему 2 )
Проблема №2
ALTER TABLE COUNTRIES
ADD CONSTRAINT COUNTR_REG_FK FOREIGN KEY
(
REGION_ID
)
REFERENCES REGIONS
(
REGION_ID
)
NOT DEFERRABLE
;
Выдает ошибку:
TBR-7001: General syntax error.
at line 10, column 5:
NOT DEFERRABLE
Опять таки документации по созданию constraint'ов я не нашел, но на практике, если мы хотим отложенные ограничения, то мы пишем DEFERRABLE, если же мы хотим всегда проверять это ограничение, то не указываем ничего (это значение по умолчанию).
Схема создана, теперь можно и прогнать скрипты для тестирования возможностей СУБД. Скрипты я взял от сюда:
http://www.srikanthtechnologies.com/oracle/dec9/hrqueries.html
Проблема №3
Запрос:
SELECT SYSDATE - to_date('01-jan-2011') FROM DUAL
Дает ошибку:
TBR-5113: Invalid month value 'jan-2011'. (01-jan-2011)
Корректным для Tibero был такой запрос:
SELECT SYSDATE - to_date('20110101') from dual
Эта мелочь мне кажется проблемой из-за того, что компания заявляет, что одной из главных направлений их развития является совместимость с Oracle. А совместимость — это не только поддержка качественного кода, но и корректная работа плохого кода. И когда что-то по умолчанию работает в Oracle, то при такой политике логично ожидать работы этого по умолчанию и в Tibero.
Других ошибок из этих скриптов мне получить не удалось. Отдельно проверил pivot, различные нотации join, иерархические запросы: все работает, странно работают pipeline функции и все, что с ними связано. Вот, простой пример:
Проблема №4
Создаю типы
CREATE OR REPLACE TYPE TEST_TYPE IS OBJECT( TESTYPE NUMBER );
CREATE OR REPLACE TYPE TEST_TYPE_TABLE IS TABLE OF TEST_TYPE;
Создаю функцию выдающую таблицу
CREATE OR REPLACE FUNCTION TEST_FUNCTION(PARAM IN NUMBER)
RETURN TEST_TYPE_TABLE
IS
RSLT TEST_TYPE_TABLE;
BEGIN
RSLT := TEST_TYPE_TABLE();
RSLT.EXTEND;
RSLT(RSLT.LAST) := TEST_TYPE(PARAM);
RETURN RSLT;
END;
Делаю запрос:
SELECT * FROM TABLE( test_function( 2 ) )
Получил:
TBR-8051: User-defined functions are not permitted in the expression.
at line 1, column 23:
select * from table( test_function(2) )
Попытался исправить положение:
select * from table( cast(test_function(2) as test_type_table) )
Результат еще хуже:
TBR-8021: Invalid table name.
at line 1, column 47:
select * from table( cast(test_function(2) as test_type_table) )
Но это производитель божится вот-вот исправить, но пока имеем то, что имеем.
Проблема №5
Подключение менеджеров базы данных. Это целая проблема и пляски с бубнами. Большинство общаться с базой не хочет или же настройка крайне не очевидная. Производитель обещает вот-вот будет tbrliboci.dll, но пока его нет.
Проблема №6
Попытался Oracle Forms 9 подключить к Tibero. Получил ошибку контрольной суммы при подключении. Дальше продвинуться не удалось.
Проблема №7
Мне оказалось достаточно мучительно пользоваться Explain Plan без dbms_xplan.display .
По итогам тестов, загрузки готовых пакетов и некоторых готовых PL/SQL систем могу сказать, что достаточно простые и легкие системы переносятся хорошо. Все работает, никаких проблем не возникает. Писать на ней с 0 можно и, наверное, вполне успешно. Если, конечно знаешь английский и готов терпеть, что что-то работает на так как в Oracle. В случае же больших систем, как интернет магазин, абс банка, складские систему учета, проблемы наличия пакетов, плохой работы с pipeline делают процесс миграции мучительным и сопряженным с переписыванием готового кода, что не очень приятно и иногда достаточно затратно.
В-целом мне кажется, что у этого продукта есть шанс на выживание. И сейчас уже, как я говорил в первой части есть российские компании, которые с ним работают. Работают там наши парни, а толковой информации на русском языке нет. Поэтому очень хочется, чтобы вокруг данного продукта начало создаваться русскоязычное сообщество людей, которые могут подсказать, помочь или поделиться опытом работы с этой субд Tibero.
P.S. Большой спасибо Петру Житникову за помощь в написании.